2009-06-23 88 views
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(); 
     }; 
    } 
+1

您好,我的感谢已被版主删除!?!仅供参考,本文末尾包括:谢谢,皮特。我不喜欢主持人挑剔我的帖子,特别是取消我的礼貌。 – slypete 2009-06-23 18:27:10

回答

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框架的内容提取会更好。)

+0

嗨,谢谢。这正是我所拥有的,但它包含脚本标签。你能解释一下你的意思吗?我不熟悉。谢谢! – slypete 2009-06-23 18:22:06

+0

@slypete,您使用哪种语言或工具来执行正则表达式? – molf 2009-06-23 18:24:48

+0

@molf,我使用JavaScript和jQuery。 var javascript = this.data.match(/ ] + id =“JSBALLOONS”>([\ S \ s] *?)<\/script>/ig); this.javascript = eval('('+ javascript +')'); – slypete 2009-06-23 18:28:36

2

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

(有方式来定义子表达式,而不限定捕获基团的 - 我忘记语法)

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

但回到molf的解决方案。假如他说要使用这个模式来代替:

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

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

2

请勿尝试对非正规语言使用正则表达式。正确的方法是使用XML解析器,在DOM:

document.getElementById("JSBALLOONS") 

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

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

灿有人更合格的纠正这一点?

0

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

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))