Page 284 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 284
гарантировать, что они будут следовать в том же порядке. Таким образом, нужно
учитывать следующие варианты исходного кода (среди многих других).
const html =
' < а class " f oo" href=" /foo" id " f oo">Foo</a>\n ' +
=
=
=
' < А href ' / f oo ' Class " f oo" >Foo</a>\n ' +
=
' < а href=" / f oo" >Foo</a>\n ' +
=
' < а onclick " j avascript : a lert ( ' f oo ! ' ) " href " / f oo">Foo</a ' ;
=
>
К настоящему времени вам необходимо понимать, что это трудная задача для ре
гулярного выражения: слишком много возможных вариантов! Однако мы можем
значительно сократить количество вариантов, разделив это регулярное выражение
на два: одно - для распознавания дескрипторов <а> и второе - для замены содер
жимого дескрипторов <а> только тем, что вы хотите.
Давайте сначала рассмотрим вторую задачу. Если все, чего вы хотели, - это толь
ко дескриптор <а>, а все атрибуты, кроме c l a s s , id и href, можно отбросить, то
задача куда проще. Но даже в этом случае, как мы видели ранее, может возникнуть
проблема, если мы не сможем гарантировать, что атрибуты следуют в определен
ном порядке. Есть несколько способов решить эту задачу, но мы будем использовать
String . prototype . spli t, чтобы просматривать атрибуты по одному.
function sanitizeATag ( a Tag) {
1 1 получить части дескриптора . . .
const parts = aTag . m atch ( / <a\s+ ( . * ? ) > ( . * ? ) <\ / a>/i ) ;
/ / parts [ 1 ] - атрибуты открывающего дескриптора <а>
1 1 parts [2] - то, что между дескрипторами <а> и </а>
const attributes = parts [ l ]
1 1 теперь разделяем на отдельные атрибуты
. s plit ( / \s+ / ) ;
return ' < а ' + attributes
11 мы хотим только атрибуты class, id и href
. f ilter ( a ttr => / л ( ? : c lass l i d l h ref) [ \ s=] /i . test ( a ttr) )
1 1 соединить через п р обел
. o i ( ' ' )
n
j
/ / закрыть открытый дескриптор <а>
+ ' > '
/ / добавить содержимое
+ parts [ 2 ]
1 1 и завершающий дескриптор
>
+ ' < /а ' ;
Эта функция длиннее, чем могла бы быть, но мы разредили ее для ясности. Обра
тите внимание, что даже в этой функции мы используем несколько регулярных вы
ражений: одно - чтобы распознать части дескриптора <а>, одно - для разделения
(регулярное выражение используется для идентификации одного или нескольких
Функции замены 287

