Многократное использование отрицательного прогноза (или сопоставление нескольких символов с помощью ^)?

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Я хочу сделать что-то вроде этого:

 /<script[^>]*>(?!</script>)*</script>/g
  

чтобы сопоставить тег all scripts в html-строке, используйте javascript.

Я знаю, что это не сработает, но, похоже, я не могу найти никаких других решений. Тег script может либо использовать атрибут src и закрывать его самостоятельно сразу после ( <script src="..." type="text/javascript"></script> ), либо может содержать код внутри тега script ( <script type="text/javascript">...</script> )

Ответ №1:

Вы были близки

 /<script[^>]*>(?:(?!</script>).)*</script>/g
  

У вас должно быть что-то, что может съесть фактическое тело скрипта. Вот что . здесь делает.

Предварительная проверка должна выполняться перед каждым символом, поэтому она помещается в дополнительную (не захватывающую) группу. Чтобы записать исходный код скрипта в группу 1, просто добавьте еще один набор скобок вокруг (?:...) , как @AlanMoore указал в комментариях.

Комментарии:

1. @Denis: Это не было частью требования. Хотя это не повредило бы. Из того, что я вижу, OP достаточно опытен, чтобы сделать это сам. 🙂

2. Исправление: чтобы захватить исходный код скрипта, вам нужно было бы добавить другой набор скобок: ((?:(?!</script>).)*) . Если бы вы просто удалили ?: из существующей группы — ((?!</script>).)* — вы бы в конечном итоге записали только последний символ исходного кода.

Ответ №2:

Попробуйте это

 /<script[^>]*>.*?</script>/g
  

Я не вижу причин для негативного прогноза. .*? это отложенное сопоставление, так что оно совпадает только до следующего закрывающего тега, а не до последнего.