什么正则表达式会匹配这些数据?

时间:2009-06-23 18:04:57

标签: javascript regex parsing xhtml html-parsing

我在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 个答案:

答案 0 :(得分: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框架提取内容可能会更好。) < / p>

答案 1 :(得分:2)

绅士的意思是1美元是“第一个捕获组的价值”。将正则表达式的一部分括在括号中时,它会定义捕获组。你从左到右计算它们。每个左括号都会启动一个新的捕获组。它们可以嵌套。

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

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

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

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

在这种情况下,如果你有多个脚本元素,这个不正确的模式将吞噬它们,因为它是贪婪的,值得解释。此模式将从第一个开始标记开始,与其结束标记匹配,继续,最后匹配最后一个。 molf解决方案中的魔力是(。*?)中的问号,这使得它不贪婪。它将返回与模式匹配的最短字符串,因此不会吞噬额外的脚本元素。

答案 2 :(得分:2)

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

document.getElementById("JSBALLOONS")

编辑:关于你的评论,我没有使用JavaScript或jQuery的经验,但经过一些搜索后,我认为这些内容应该有效:

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

有人可以更正确吗?

答案 3 :(得分:0)

foo成为包含代码的字符串。然后,您可以通过

剥离封闭的标签
foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))