我有一个像这样的正则表达式:
/(?:<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' );
}
标记不匹配,有没有办法让正则表达式不捕获第一个匹配项?
答案 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
表示“如果$1
为truthy,则为$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';