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
   269   270   271   272   273   274   275   276   277   278   279