PullRequest
       30

1 голос
/ 23 июня 2019

У меня есть некоторый HTML-код со встроенным JavaScript в теге <script>, который содержит регулярное выражение, удаляющее лишние пробелы между символами > и <, как в

<script>
[...]
output = output.replace(/>\s*</g, '><');
[...]
</script> 

Это недопустимоHTML (например, в соответствии с PHP DOMDocument->loadHTML()), поскольку последовательность символов </ завершает обработку и, как ожидается, за ней последует остальная часть закрывающего тега script>.

Я попытался экранировать < как &lt;, но затем выражение больше не соответствует (проверено в jsfiddle ).

Обходной путь - вставить что-то в регулярное выражениеэто на самом деле ничего не делает, но отделяет < от /, например

output = output.replace(/>\s*[<]/g, '><');

Это работает и имеет ожидаемое поведение, но выглядит как ужасный взлом.

Как правильно выбрать < перед / в регулярном выражении js?

1 Ответ

1 голос
/ 23 июня 2019

Если PHP DOMDocument->loadHTML() считает, что элемент скрипта на этом заканчивается, я уверен, что это ошибка в DOMDocument->loadHTML().Элементы скрипта заканчиваются на </script>, а содержимое script элементов - , а не HTML.script элементов имеют гораздо более ... интересную ... модель контента, чем та, которую спецификация использует для объяснения в нескольких параграфах.

Что касается проблем с </, спецификация только упоминает , касающийся <!-- и </script>, но не </ в целом.

Но если вам нужен встроенный скрипт (у вас не возникло бы этой проблемы, если бы код былв файле .js), и вам нужно загрузить его с чем-то, что, по-видимому, содержит ошибку, ваш хак с классом символов ([<] вместо <) совсем не плох.(Я сомневаюсь, что производительность вас беспокоит, но если бы это было так, я думаю, мы могли бы с достаточной уверенностью сказать, что обработчик регулярных выражений движка JavaScript сможет оптимизировать этот односимвольный класс символов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...