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