JS RegExp没有捕获匹配

时间:2016-01-18 08:14:02

标签: javascript regex

我有一个像这样的正则表达式:

/(?:<script\s+[^>]*?src="([^"]+)"[^>]*><\/script>)|(?:<link\s+[^>]*?href="([^"]+)"[^>]*>)/g

我想使用此正则表达式替换<script>标记中的“src”或<link />标记中的“href”。

像这样的代码:

html.replace( /(?:<script\s+[^>]*?src="([^"]+)"[^>]*><\/script>)|(?:<link\s+[^>]*?href="([^"]+)"[^>]*>)/g, function( m, n ) {
    return m.replace( n, 'other url' );
}

它与<script>标记工作正常但不是链接标记。因为正则表达式仍然将([^“] +)中的第一个匹配设置为参数,因此”n“参数未定义,因为它不匹配<script>标记。如果正则表达式匹配{{1 }} tag,代码必须修改为:

<link>

如果正则表达式与html.replace( /(?:<script\s+[^>]*?src="([^"]+)"[^>]*><\/script>)|(?:<link\s+[^>]*?href="([^"]+)"[^>]*>)/g, function( m, n ) { return m.replace( arguments[ 2 ], 'other url' ); } 标记不匹配,有没有办法让正则表达式不捕获第一个匹配项?

2 个答案:

答案 0 :(得分:1)

听起来你想要的是:

html.replace(/(<script\s[^>]*?src="|<link\s[^>]*?href=")[^"]+"/g, function ($0, $1) {
    return $1 + 'other url' + '"';
});

(通常注意"You can't parse [X]HTML with regex")。

编辑添加:“最小修复”是编写替换函数,如下所示:

function ($0, $1, $2) {
    return m.replace($1 || $2, 'other url');
}

其中||是布尔OR运算符:$1 || $2表示“如果$1truthy,则为$1;否则为$2” 。非空字符串是真实的,而undefined是假的,因此$1 || $2将评估您的捕获组匹配的东西。

(注意:如果您的捕获组能够匹配空字符串,则必须编写更复杂的内容,因为如果{{1}您不希望结束$2 } $1''$2。但是在您的示例中不适用。)

答案 1 :(得分:0)

@ruakh是正确的,你不应该使用正则表达式解析html,试试这个

//Here is bit from inside the .Service<T>() call
s.WhenStarted((YourService svc, HostControl hc) => svc.Start());

//And the svc.Start method would look something like this:
class YourService
{
   public bool Start() {
     //return true if all is well
     //or false if you want service startup to be halted
   }
}

如果你可以使用jQuery,那就更容易了

var div = document.createElement('div');
div.innerHTML = html;

var scriptTags = div.getElementsByTagName('script');
for (var i = 0; i < scriptTags.length; i++)
    scriptTags[i].src = 'other url';

var linkTags = div.getElementsByTagName('link');
for (var i = 0; i < linkTags.length; i++)
    linkTags[i].href = 'other url';