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
   279   280   281   282   283   284   285   286   287   288   289