Регулярка преобразование пасивных ссылок в активные

Тема в разделе "Как сделать...", создана пользователем ajrengen, 11 фев 2012.

  1. ajrengen

    ajrengen Постоялец

    Регистр.:
    28 сен 2008
    Сообщения:
    110
    Симпатии:
    29
    Здравствуйте,

    При вводе комментариев нужно пасивные ссылки типа http://www.acmodasi.ru преобразовать в активные
    HTML:
    <a href="http://www.acmodasi.ru">http://www.acmodasi.ru</a>
    При этом надо учесть что могут быть добавлены теги вставки видео, например с ютуба вида
    HTML:
    <iframe src="http://www.youtube.com"></iframe>

    в этих тегах ссылки заменятся, естественно, не должны.
    Нашёл такую конструкцию
    PHP:
    preg_replace("#(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
        
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$text);


    Но она заменяет все ссылки в том числе в тегах. Как сделать что бы линки в тегах она не преобразовывала?
    Спасибо.
     
  2. lonejan

    lonejan Постоялец

    Регистр.:
    7 фев 2008
    Сообщения:
    110
    Симпатии:
    10
    Как вариант можно использовать strip_tags, с указанием разрешенных тэгов, а потом пропустить через твою регулярку.
     
  3. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    PHP:
    foreach(preg_split('#(<a[^>]+>.+?</a>)#is',$text,-1,1|2) as $part// разделяем анкоры и html
    $res_text.= stristr($part,'<a') ? $part preg_replace("#(?<=[^\"'=])(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
       
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$part);
    условие предшествующего текста (?<=[^\"'=]) пропускает атрибуты
     
    ajrengen нравится это.
  4. ajrengen

    ajrengen Постоялец

    Регистр.:
    28 сен 2008
    Сообщения:
    110
    Симпатии:
    29
    lonejan
    Так и делаю, среди оставшихся тегов после strip_tags есть iframe и object и img в них содержится ссылка src="", которая также заменится на редирект, а значит будет неработоспособной.

    pitkina
    Не работает, чего-то не хватает. Теги в принципе пропускает, но ссылки вне тегов активными не делает. Тег <a> вырезается stip_tags его не надо обрабатывать отдельно.
     
  5. ajrengen

    ajrengen Постоялец

    Регистр.:
    28 сен 2008
    Сообщения:
    110
    Симпатии:
    29
    Давайте по другому, надо определить начинается ли http как первый символ строки, есть ли перед ней пробел, знак табуляции или перенос строки.
    Вот готовая регулярка:
    PHP:
    $res_text preg_replace("#(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
        
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$text);
     
  6. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    PHP:
    preg_replace("#(?<=^|\s)(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
        
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$text);
    ^ начало текста. \s пробел, tab, перенос
     
    ajrengen нравится это.
  7. ajrengen

    ajrengen Постоялец

    Регистр.:
    28 сен 2008
    Сообщения:
    110
    Симпатии:
    29
    pitkina
    В целом заработало, но не обрабатываются переносы строки. То есть если ссылка с новой строки то она остаётся пассивной.
    Код:
    http://www.acmodasi.ru - активная, в начале текста.
    http://www.acmodasi.ru - пассивная с переносом строки
    http://www.acmodasi.ru - пассивная с переносом строки
    
     
  8. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    вероятно скрипт заменяет переносы на <br>
    тогда первое условие
    Код:
    (?<=^|\s|br>|br/>)
     
    ajrengen нравится это.
  9. ajrengen

    ajrengen Постоялец

    Регистр.:
    28 сен 2008
    Сообщения:
    110
    Симпатии:
    29
    Да, действительно, так и было, ещё раз спасибо.