JavaScript正则表达式:如何匹配多行和闭合标签

4
var ex = /(<script\s?[^>]*>)([\s\S]*)(<\/script>)/;
//Note: here is 2 script tags
var str = '<script>\nvar x=0;\n</script>\n<div>\nhtml\n</div>\n<script>var y=0;\n</script>'
str.replace(ex, function(full, prefix, script, suffix) {
    return prefix + doSomething(script) + suffix;
})

但我得到了错误的脚本:var x=0;</script><div>..</div><script>var y=0;

我想要的是:var x=0;var y=0;

2个回答

20

使用如下正则表达式:

<script>([\s\S]*?)</script>
在JavaScript中,我们无法使用 . 选择任意字符包括换行符的模式,因此我们使用 [\s\S] 字符类来匹配所有字符,包括空白和非空白字符,包括换行符。而?用于非贪婪匹配,以避免嵌套脚本标签的情况发生。

ridgerunner 也是正确的,但你解释了 ? 的作用,谢谢。 - guilin 桂林
@guilin 桂林 - 我已经提到过了。在这种情况下,? 表示 *? 匹配前面的标记 0 次或多次,并且在满足下一个标记之前尽可能少地匹配字符。因此,类似 <script><script></script></script> 这样的内容将不会完全匹配。 - manojlds
1
不需要在开始和结束标记周围捕获组。同时应允许在开始标记内包含属性。否则,没有回顾的情况会更好。+1 - ridgerunner

3

这个函数匹配 SCRIPT 元素的内容,并返回一个字符串数组:

// Return an array of <script> elements contents. 
function getScriptsConntents(text) {
    var scripts = [];
    var m;
    var re = /<script[^>]*>([\s\S]*?)<\/script>/ig;
    while (m = re.exec(text)) {
        scripts.push(m[1]);
    }
    return scripts;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接