Page 285 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 285

пробельных символов) и  одно  - для фильтрации только желательных атрибутов.
       Было бы куда труднее сделать все это в одном регулярном выражении.
          Т е перь интересная часть: использование функции sanitizeATag в блоке HTML,
       который,  кроме  прочего  НТМL-кода,  может  содержать  много дескрипторов  <а>.
       Достаточно просто написать регулярное выражение для распознавания только де­
       скрипторов <а>.

                                     g
       html . m atch ( / <a  . * ?>  ( . * ? ) <\/a>/i ) ;
          Но что нам с этим делать? Как  можно передать функцию в  S t r i ng . prototype .
       replace в качестве параметра замены. До сих пор в качестве параметра замены мы
       использовали  только  строки.  Функция  позволяет  предпринять специальное дей­
       ствие для каждой замены. Прежде чем закончить свой пример, давайте используем
       console . log, чтобы увидеть, как это работает.
       html . r eplace ( / <a  . * ? > ( . * ? ) < \ /a>/ig,  function (m,  g l ,   offset )
                     g
                                                             t
           соnsоlе . l о ( ' Дескриптор  <а>  найден  в  позиции  $ { o ffse } .  Содержимое :
       $ { gl }  1  )  ;
       }  )   ;
          Функция, которую вы передаете в S t ring . prototype . replace, получает следую­
       щие аргументы по порядку.

          •  Вся соответствующая строка (эквивалент $&).
          •  Соответствующая группа (если есть). Таких аргументов будет столько, сколько
             есть групп.
          •  Смещение в пределах исходной строки (число), где произошло распознавание.
          •  Исходная строка (используется редко).

          Здесь возвращаемое значение функции используется для замены текста в  воз­
       вращенной строке. В  данном примере мы только  регистрируем факт на консоли,
       но ничего не возвращаем из функции. Таким образом, из функции будет возвраще­
       но значение undefined, которое затем преобразовывается в строку и используется
       для замены. Задачей этого примера была механика, а не фактическая  замена; здесь
       мы просто отбрасываем получающуюся строку.
          Теперь вернемся к нашему примеру. У нас уже есть своя функция для  санации
       дескриптора <а> и способ для поиска дескрипторов <а> в блоке HTML, поэтому мы
       можем просто их совместить.
       html . r eplace ( / <a  . * ?<\/a>/ig,  function (m)  {
           return  s a nit z e ATag (m) ;
                       i
       } )   ;
          Мы  можем  упростить  это  еще  больше  - полагая,  что  параметры  в  функции
       sani  i z e ATag точно соответствуют тому, что передает String . prototype . replace,
           t

       288      Глава  1 7 . Регулярные выражения
   280   281   282   283   284   285   286   287   288   289   290