#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
Я не вижу причин для негативного прогноза. .*?
это отложенное сопоставление, так что оно совпадает только до следующего закрывающего тега, а не до последнего.