RegExp для добавления аттрибутов к ссылке

Тема в разделе "ExpressionEngine", создана пользователем Xacret.T, 15 ноя 2007.

Статус темы:
Закрыта.
  1. Xacret.T

    Xacret.T Постоялец

    Регистр.:
    2 июн 2006
    Сообщения:
    139
    Симпатии:
    26
    Вот столкнулся с необходимость немного "подчистить" (отредактировать) ссылки, публикуемые во всех новостях.

    необходимо использовать плагин find&replace, но, к сожалению, я не шарю в регулярных выражениях и посему прошу помощи и форумчан.

    мне необходимо сделать следующее:
    1. найти все ссылки <a ...>...</a> и добавить аттрибут rel="nofollow"
    ссылка может иметь любой набор аттрибутов, например, может быть прописан title, а может быть и не прописан - так что rel писать нужно последним аттрибутом
    2. все найденные ссылки нужно заключить в тег <noindex>ссылка</noindex>

    P.S.: плагин find and replace можно взять здесь: Перейти по ссылке

    Заранее большое спасибо за внимание.

    Добавлено через 22 минуты
    и еще, по возможность, помогите составить регэкспу полностью удаляющую все ссылки, но оставляющую внутритеговый текст (между <a...> и </a>)
     
  2. mxnr

    mxnr Постоялец

    Регистр.:
    7 июн 2007
    Сообщения:
    134
    Симпатии:
    39
    начнем с конца:
    PHP:
    {exp:replace find="<a[^>]*href=QUOTE(.+)QUOTE[^>]*>(.*)<\/a>" replace="$2" regex="yes"}
    {/
    exp:replace}
    удаляет все ссылки, оставляет только текст.

    2.
    PHP:
    {exp:replace find="(<a .*?)>(.*?)<\/a>" replace='<noindex>$1 target="_blank" rel="nofollow">$2</a></noindex>' regex="yes"}
    <
    a href="http://nulled.ws" title="hello">Hello</a>
    {/
    exp:replace}
    Out - <noindex><a href="http://nulled.ws" title="hello" target="_blank" rel="nofollow">Hello</a></noindex>
    А можно так (позволяет менять урл, например, добавить редирект:(
    PHP:
    {exp:replace find="(<a[^>]*href=)QUOTE(.+)QUOTE(.*?)>(.*?)<\/a>" replace='<noindex>$1"?URL=$2" $3 target="_blank" rel="nofollow">$4</a></noindex>' regex="yes"}
    <
    a href="http://nulled.ws" title="hello">Hello</a>
    {/
    exp:replace}

    Out - <noindex><a href="?URL=http://nulled.ws" title="hello" target="_blank" rel="nofollow">Hello</a></noindex>
    p.s. сейчас ломаю голову над мультизаменой с регулярными выражениями. Но данный скрипт не поддерживает мульти режим с включенным regex :( надо внутрь плагина будет лезть.
     
    Xacret.T нравится это.
  3. Xacret.T

    Xacret.T Постоялец

    Регистр.:
    2 июн 2006
    Сообщения:
    139
    Симпатии:
    26
    Большое спасибо.

    по поводу мультизамены с регэкспом - обратись к девелоперу - он, я думаю, внесет изменения сам шустренько.

    кстати, не пробовал вставлять regexp в переменные (ее/пхп) и подставлять как пораметры поиска при мултизамене???
    или ты пробовал подставлять непосредственно выражения в параметр поиска???

    я думаю там просто будет конфликт из-за разделителя |
     
  4. mxnr

    mxnr Постоялец

    Регистр.:
    7 июн 2007
    Сообщения:
    134
    Симпатии:
    39
    Да, я тоже так думаю, что это невозможно из-за того, что | обрабатывается как часть рега . Поэтому и требуется внутреннее копание. У разработчика уже есть подобные вопрос в комментах еще от августа месяца.

    p.s. да, плагин при наличии разделителей | и отключёнными регами, разбивает строку поиска и замены на части и вносит все это в массивы, а затем прогоняет замену в цикле по каждой позиции. То есть, все что нужно сделать, это определить альтернативный символ разделитель условия и внести его плагин, сделав дополнительную функцию обработки массива с preg_replace. Если вечером не забуду - сделаю :) Было бы очень удобно объединить несколько условий, например, обработку линков + вытягивания кода в одну строку (find='\f|\n|\r|\t|\x0B|\0' replace='' regex='yes'), без использования дополнительных шаблонов. Вот только интересно, как это скажется на производительности??
     
  5. Xacret.T

    Xacret.T Постоялец

    Регистр.:
    2 июн 2006
    Сообщения:
    139
    Симпатии:
    26
    ну сейчас даже с помощью дополнительных шаблонов невозможно описать 2 регэкспа на один кусок кода - ведь нельзя же вкладывать в один поиск и замену еще и второй такой же тег. :nezn:

    по поводу производительности - думаю ничего страшного не случится - если конечно не прописать поиска 10-20 регэкспов. :ah:
     
  6. difour

    difour Прохожие

    сделай простую замену
    Код:
    <a 
    на
    Код:
    <noindex><a 
    тож самое с закрывающимися тэгами
    и
    Код:
    <a 
    на
    Код:
    <a rel="nofollow"
    никакие регулярки не нужны, + нагрузка меньше будет
     
  7. mxnr

    mxnr Постоялец

    Регистр.:
    7 июн 2007
    Сообщения:
    134
    Симпатии:
    39
    в принципе да, если не требуется сложных преобразований, то можно и без регулярок:
    Код:
    {exp:replace find='<a|href="|</a>' replace='<noindex><a rel="nofollow"|href="?URL=|</a></noindex>' multiple="yes"}
    <a href="http://nulled.ws" title="hello">Hello</a>
    {/exp:replace}
    Out - <noindex><a rel="nofollow" href="?URL=http://nulled.ws" title="hello">Hello</a></noindex>  
     
  8. mxnr

    mxnr Постоялец

    Регистр.:
    7 июн 2007
    Сообщения:
    134
    Симпатии:
    39
    Немного доработал данный плагин напильником :). Теперь у него есть параметр clearcode='yes'.

    Код:
    пример
    {exp:replace find='<a|href="|</a>' replace='<noindex><a rel="nofollow"|href="?URL=|</a></noindex>' multiple="yes" clearcode='yes'}
    {/exp:replace}
    у теста заключенного в теги удаляются(без регулярок:(
    \t \n \vtab \r
     

    Вложения:

    • pi.replace.rar
      Размер файла:
      4 КБ
      Просмотров:
      7
Статус темы:
Закрыта.