我正在尝试返回文本正文中任何标记的内容。我目前正在使用以下表达式,但它只捕获第一个标记的内容,并在此之后忽略其他任何标记。
以下是html的示例:
<script type="text/javascript">
alert('1');
</script>
<div>Test</div>
<script type="text/javascript">
alert('2');
</script>
我的正则表达式如下:
//scripttext contains the sample
re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
var scripts = re.exec(scripttext);
当我在IE6上运行它时,它会返回2个匹配项。第一个包含完整标记,第二个包含警报('1')。
当我在http://www.pagecolumn.com/tool/regtest.htm上运行时,它会给我2个结果,每个结果只包含脚本标记。
答案 0 :(得分:33)
这里的“问题”在于exec
的工作原理。它仅匹配第一次出现,但将当前索引(即插入位置)存储在正则表达式的lastIndex
属性中。要获取所有匹配,只需将正则表达式应用于字符串,直到它无法匹配(这是一种非常常见的方式):
var scripttext = ' <script type="text/javascript">\nalert(\'1\');\n</script>\n\n<div>Test</div>\n\n<script type="text/javascript">\nalert(\'2\');\n</script>';
var re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
var match;
while (match = re.exec(scripttext)) {
// full match is in match[0], whereas captured groups are in ...[1], ...[2], etc.
console.log(match[1]);
}
答案 1 :(得分:3)
不要使用正则表达式来解析HTML。 HTML不是常规语言。使用DOM的强大功能。这更容易,因为它是正确的工具。
var scripts = document.getElementsByTagName('script');
答案 2 :(得分:2)
尝试使用全局标志:
document.body.innerHTML.match(/<script.*?>([\s\S]*?)<\/script>/gmi)
编辑:添加了多行和不区分大小写的标志(原因很明显)。
答案 3 :(得分:0)
第一组包含标签的内容。
编辑:你不必用引号包围正则表达式吗?像:
re = "/<script\b[^>]*>([\s\S]*?)<\/script>/gm";
答案 4 :(得分:0)
在.Net中,有一个子匹配方法,在PHP中,preg_match_all,它可以解决你的问题。在Javascript中没有这样的方法。但你可以自己做。
测试 http://www.pagecolumn.com/tool/regtest.htm
选择 $ 1elements 方法将返回您想要的内容
答案 5 :(得分:0)
试试这个
for each(var x in document.getElementsByTagName('script');
if (x && x.innerHTML){
var yourRegex = /http:\/\/\.*\.com/g;
var matches = yourRegex.exec(x.innerHTML);
if (matches){
your code
}}