0

我在 XHTML 文档中有以下内容:

<script type="text/javascript" id="JSBALLOONS">
    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
</script>

我正在尝试选择两个脚本标签之间的所有内容。如果有帮助,id则将始终是 JSBALLOONS。我知道如何选择包括脚本标签的内容,但我不知道如何选择不包括脚本标签的内容。正则表达式的结果应该是:

    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
4

4 回答 4

8

(专门针对 Javascript 解决方案更新了帖子。)

在 Javascript 中,您的代码可能如下所示:

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) {
    inner_script = RegExp.$1;
}

括号之间的部分([\S\s]*?)由正则表达式引擎保存,并且在找到匹配项后可供您访问。在 Javascript 中,您可以使用RegExp.$1来引用脚本标签内的匹配部分。如果您有多个这样的组,被 包围(),您可以用 来引用它们RegExp.$2,依此类推,直到RegExp.$9

默认情况下,Javascript 不会匹配换行符,这就是为什么我们必须使用([\S\s]*?)而不是(.*?),这可能更有意义。为了完整起见,在其他语言中,如果您使用s修饰符 ( /.../s),则不需要这样做。

(我必须补充一点,当从这样的 HTML 页面中抓取内容时,正则表达式通常非常脆弱。使用jQuery框架来提取内容可能会更好。)

于 2009-06-23T18:08:50.553 回答
2

绅士所说的$1的意思是“第一个捕获组的价值”。当您将正则表达式的一部分括在括号中时,它定义了捕获组。你从左到右数。每个左括号开始一个新的捕获组。它们可以嵌套。

(有一些方法可以在不定义捕获组的情况下定义子表达式 - 我忘记了语法。)

在 Perl 中,$1 是保存与第一个捕获组匹配的字符串的魔法变量,$2 是与第二个捕获组匹配的字符串,等等。其他语言可能需要您在返回的匹配对象上调用方法来获取第 N 个捕获组。

但回到 molf 的解决方案。假设他说要改用这种模式:

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/

在这种情况下,如果您有多个脚本元素,那么这种不正确的模式会将它们全部吞噬,因为它是贪婪的,这一点值得解释。这个模式将从第一个开始标签开始,匹配到它的结束标签,继续,最后匹配最后一个。molf 解决方案的神奇之处在于 (.*?) 中的问号,这使得它不贪婪。它将返回与模式匹配的最短字符串,因此不会吞噬额外的脚本元素。

于 2009-06-23T18:37:46.777 回答
2

不要尝试对非常规语言使用正则表达式。正确的方法是使用 XML 解析器。DOM:

document.getElementById("JSBALLOONS")

编辑: 关于您的评论,我没有使用 JavaScript 或 jQuery 的经验,但经过一番搜索,我认为这些方面的东西应该可以工作:

$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success: function(xml) {
    return $(xml).find("#JSBALLOONS").text();
  }
});

更有资格的人可以纠正这个吗?

于 2009-06-23T18:44:56.733 回答
0

foo是包含代码的字符串。然后,您可以通过剥离封闭标签

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))
于 2009-06-23T19:00:31.103 回答