Page 274 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 274
образом, сначала следует найти соответствие area, а затем а; в противном случае со
ответствия area никогда не будет найдено!
Запустив этот пример, вы обнаружите, что получилось несколько непреднамерен
ных соответствий: слово link внутри дескриптора <а>, а также все экземпляры сим
вола а, которые не входят в НТМL-дескрипторы, а просто являются частью англий
ского текста. Один из способов решения этой проблемы подразумевал бы изменение
a
1
регулярного выражения на /< r ea < а 1 <link 1 <script 1 <source/ (угловые скобки не
являются метасимволом регулярного выражения, поэтому их не нужно экраниро
вать), но мы сделаем все намного лучше.
Анаnи з НТМL - к ода
В предыдущем примере мы выполнили вполне обычную· задачу с регулярными
выражениями: нашли соответствие заданным строкам в HTML-коде. Хотя эта задача
вполне традиционна, я должен предупредить вас, что несмотря на то, что, используя
регулярные выражения, вы можете делать весьма полезные вещи с НТМL-кодом, вы
не можете анализировать его с помощью регулярных выражений. Анализ (parsing)
подразумевает полное разделение чего-то на составные части. Обработчик регуляр
ного выражения способен анализировать текст только обычных (regular) языков (от
сюда и название!). Структура обычных языков чрезвычайно проста, но чаще всего
вы будете использовать регулярные выражения для обработки более сложных язы
ков. Зачем это предупреждение, если регулярные выражения применимы для более
сложных языков? Важно понимать, что регулярные выражения имеют ограничения
и в соответствующем случае лучше использовать нечто более мощное. Даже при том
что мы будем использовать регулярные выражения для работы с НТМL-кодом, впол
не возможно создать такой код, который окажется не по силам для регулярных вы
ражений. Чтобы получить решение, которое сработает в 100% случаев, вам нужно
использовать анализатор (parser). Рассмотрим следующий пример.
>
const html = ' < br> [ ! CDATA [ [ <br ] ] ' ;
const matches = html . m atch ( /<br>/ig) ;
Это регулярное выражение найдет соответствие дважды; но в нашем примере
есть только один истинный дескриптор <br>; другая соответствующая строка - это
просто символьные данные (character data - CDATA), а не НТМL-код. Возможности
регулярных выражений также чрезвычайно ограничены, когда дело доходит до рас
познавания иерархических структур (таких, как дескриптор <а>, вложенный в де
скриптор <р> ). Теоретические объяснения этих ограничений не рассматриваются
в данной книге, но вывод ясен: если вы изо всех сил пытаетесь создать регулярное
выражение для распознавания чего-то очень сложного (такого, как языковые кон
струкции в НТМL-коде), всегда имейте в виду, что регулярное выражение может
просто не быть подходящим инструментом для этого.
Анализ Н ТМL-кода 277

