ФорумПрограммированиеPHP для идиотов → И снова регулярка

И снова регулярка

  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2012 г. 4:53

    Столкнулся с такой проблемой. Нужно все ссылки прогонять через регулярку и на внешние задавать атрибуты target='_blank' и rel='nofollow'. Как это адекватно сделать одной регуляркой я так и не придумал. В итоге получилось у меня ЭТО:
    function url_replace($matches) {

    if(strstr($matches[1], "mysite.com")) {

    $arr = explode(" ", $matches[1]);

    foreach($arr as $k => $v) {

    $atr = explode("=", $v);

    $url[$atr[0]] = str_replace(array("\"", "'"), "", $atr[1]);
    }

    return &quot;<a href=&#39;&quot;.$url[&#39;href&#39;].&quot;&#39;>&quot;.$matches[2].&quot;</a>&quot;;

    }
    else {

    $arr = explode(&quot; &quot;, $matches[1]);

    foreach($arr as $k => $v) {

    $atr = explode(&quot;=&quot;, $v);

    $url[$atr[0]] = str_replace(array(&quot;\&quot;&quot;, &quot;&#39;&quot;), &quot;&quot;, $atr[1]);
    }

    return &quot;<a href=&#39;&quot;.$url[&#39;href&#39;].&quot;&#39; target=&#39;_blank&#39; rel=&#39;nofollow&#39;>&quot;.$matches[2].&quot;</a>&quot;;
    }
    }

    function parse_text($txt) {

    echo preg_replace_callback(&quot;/\<a (.*?)\>(.*?)\<\/a\>/i&quot;, &quot;url_replace&quot;, $txt);
    }

    parse_text($text);


    Подскажите чего тут можно подсократить и сделать более адекватным и правильным?!?

    Уже косяк вижу, если будет стоять например alt=&#39;123 456&#39; то разбивание на массив будет кривым.
    from TRIAL with LOVE
  • lolcat

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 14 февраля 2012 г. 5:07, спустя 13 минут 41 секунду

    А нужно именно регуляркой? Может быть лучше использовать DOM подход?
  • technobulka

    Сообщения: 4552 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2012 г. 5:18, спустя 10 минут 34 секунды

    Регулярное выражение:
    @href=&quot;(ht|f)[email protected]

    Обрабатываемый текст:
    &lt;a href=&quot;http://qwe&quot;>
    &lt;a href=&quot;https://qwe&quot;>
    &lt;a href=&quot;ftp://qwe&quot;>

    Заменить на:
    target=&#39;_blank&#39; rel=&#39;nofollow&#39; $0

    тестил в фишках пыхи… результат:
    &lt;a target=&#39;_blank&#39; rel=&#39;nofollow&#39; href=&quot;http://qwe&quot;>
    &lt;a target=&#39;_blank&#39; rel=&#39;nofollow&#39; href=&quot;https://qwe&quot;>
    &lt;a target=&#39;_blank&#39; rel=&#39;nofollow&#39; href=&quot;ftp://qwe&quot;>
    {+++91+++} то есть во внутренних же не пишеццо полный путь
    Высокоуровневое абстрактное говно
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2012 г. 5:39, спустя 21 минуту 41 секунду

    Как выяснилось яндекс отказывается хавать такую штуку &lt;a rel=&#39;nofollow&#39; href=&quot;ftp://qwe&quot;> ему нужно чтоб этот самый nofollow стоял в конце ссылки, ну как минимум после href. Бред сумасшедшего но факт остается фактом. В итоге приходится переставлять местами атрибуты.
    from TRIAL with LOVE
  • technobulka

    Сообщения: 4552 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2012 г. 5:54, спустя 14 минут 18 секунд

    Как выяснилось яндекс отказывается хавать такую штуку &lt;a rel=&#39;nofollow&#39; href=&quot;ftp://qwe&quot;> ему нужно чтоб этот самый nofollow стоял в конце ссылки, ну как минимум после href. Бред сумасшедшего но факт остается фактом. В итоге приходится переставлять местами атрибуты.

    не вижу проблемы…

    Регулярное выражение:
    @href=&quot;(ht|f)tps?[^&quot;]+&quot;@

    Обрабатываемый текст:
    &lt;a href=&quot;http://qwe&quot;>
    &lt;a href=&quot;https://qwe&quot;>
    &lt;a href=&quot;ftp://qwe&quot;>

    Заменить на:
    $0 target=&#39;_blank&#39; rel=&#39;nofollow&#39;

    результат:
    &lt;a href=&quot;http://qwe&quot; target=&#39;_blank&#39; rel=&#39;nofollow&#39;>
    &lt;a href=&quot;https://qwe&quot; target=&#39;_blank&#39; rel=&#39;nofollow&#39;>
    &lt;a href=&quot;ftp://qwe&quot; target=&#39;_blank&#39; rel=&#39;nofollow&#39;>
    Высокоуровневое абстрактное говно
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2012 г. 5:59, спустя 5 минут 28 секунд

    Щас попробую ) Для меня вечно регулярки больным местом были
    from TRIAL with LOVE

Пожалуйста, авторизуйтесь, чтобы написать комментарий!