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 . Регулярные выражения

