如何让regex匹配多个脚本标签?

时间:2009-09-17 21:37:03

标签: javascript regex

我正在尝试返回文本正文中任何标记的内容。我目前正在使用以下表达式,但它只捕获第一个标记的内容,并在此之后忽略其他任何标记。

以下是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个结果,每个结果只包含脚本标记。

6 个答案:

答案 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
 }}