2016-01-18 3 views
0

У меня есть регулярное выражение, как это:JS RegExp не захватить матч

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

Я хочу, чтобы заменить «SRC» в <script> тег, или «HREF» в <link /> тега JavaScript с этим регулярным выражением.

код так:

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

Он работает отлично с <script> тег, но не связать тег. поскольку regexp по-прежнему устанавливает первое совпадение в ([^ "] +) в аргументы, так что параметр« n »не определен, поскольку он не соответствует тегу <script>.Если регулярное выражение соответствует тегу <link>, код должен быть модифицирована для:

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

есть ли способ, чтобы сделать регулярное выражение не захватить первый матч, если он не соответствует <script> тега

ответ

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").


Edited добавить: «минимальный фикс» будет написать свою замену-функцию, как это:

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

где || является булевым оператором ИЛИ: $1 || $2 означает «если $1 является truthy, затем $1; . В противном случае $2»Непустая строка truthy, в то время как undefined является falsy, так $1 || $2 будет оценивать в зависимости от того, из ваших захвата групп соответствует что-то

. (Примечание: если ваш захват-группы были в состоянии соответствовать пустой строка, вы должны написать что-то немного более сложным, так как вы не хотели бы, чтобы в конечном итоге с $2 если $1 является '' и $2 является undefined. Но в вашем примере это не относится.)

+0

спасибо. Я знаю, как решить эту проблему. На самом деле я хочу знать что-то о regexp – LCB

+0

@LCB: ОК. Я отредактировал свой ответ, чтобы предоставить вам «минимальное исправление». Хотя это вообще не имеет никакого отношения к регулярному выражению! – ruakh

0

@ ruakh является правильным, вы не должны использовать регулярное выражение для анализа html, попробуйте это вместо

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'; 

если вы можете использовать JQuery это еще проще

var div = $('<div/>').html(html); 
div.find('<script/>').attr('src', 'other url'); 
div.find('<link/>').attr('href', 'other url'); 
+0

большое спасибо. но я просто делаю это, строя свой проект не в производстве. – LCB

Смежные вопросы