【问题标题】:What regular expression would match this data?什么正则表达式会匹配这些数据?
【发布时间】:2010-11-05 06:30:49
【问题描述】:

我在 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();
        };
    }

【问题讨论】:

  • 您好,我的感谢被版主删除了!?!仅供参考,这篇文章的结尾曾经包括:谢谢,皮特。我不喜欢版主挑剔我的帖子,尤其是删除我的礼貌。

标签: javascript regex parsing xhtml html-parsing


【解决方案1】:

(专门针对 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 框架来提取内容。)

【讨论】:

  • 嗨,谢谢。这正是我所拥有的,但它包含脚本标签。你能解释一下你所说的1美元是什么意思吗?我很陌生。谢谢!
  • @slypete,您使用哪种语言或工具来执行正则表达式?
  • @molf,我正在使用 javascript 和 jQuery。 var javascript = this.data.match(/
  • @slypete,更新了 Javascript 中的示例。在 Javascript 中,组保存在 RegExp.$1、RegExp.$2 等中,最多为 RegExp.$9。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 谢谢,也很有帮助!
【解决方案3】:

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

document.getElementById("JSBALLOONS")

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

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

谁能更正一下这个问题?

【讨论】:

  • 文档被远程加载到一个字符串中,我需要从中提取选择的内容。我知道正则表达式不是最好的解决方案。如果您知道其他可行的解决方案,请告诉我。谢谢!
  • 再一次,它不起作用。我试过这个。请参阅我的另一个更一般的问题,原因是:stackoverflow.com/questions/1034881/… 希望有人能够为这个问题提供答案。
  • 当有人提到正则表达式标记语言时,我总是喜欢发布一个链接stackoverflow.com/questions/1732348/…
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2018-08-24
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多