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

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

  • TRIAL

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

    Spritz 14 февраля 2012 г. 1: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 "<a href='".$url['href']."'>".$matches[2]."</a>";

    }
    else {

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

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

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

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

    return "<a href='".$url['href']."' target='_blank' rel='nofollow'>".$matches[2]."</a>";
    }
    }

    function parse_text($txt) {

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

    parse_text($text);


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

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

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

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

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

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

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

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

    Обрабатываемый текст:
    <a href="http://qwe">
    <a href="https://qwe">
    <a href="ftp://qwe">

    Заменить на:
    target='_blank' rel='nofollow' $0

    тестил в фишках пыхи… результат:
    <a target='_blank' rel='nofollow' href="http://qwe">
    <a target='_blank' rel='nofollow' href="https://qwe">
    <a target='_blank' rel='nofollow' href="ftp://qwe">
    Спустя 91 сек.
    то есть во внутренних же не пишеццо полный путь
    Высокоуровневое абстрактное говно
  • TRIAL

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

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

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

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

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

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

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

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

    Обрабатываемый текст:
    <a href="http://qwe">
    <a href="https://qwe">
    <a href="ftp://qwe">

    Заменить на:
    $0 target='_blank' rel='nofollow'

    результат:
    <a href="http://qwe" target='_blank' rel='nofollow'>
    <a href="https://qwe" target='_blank' rel='nofollow'>
    <a href="ftp://qwe" target='_blank' rel='nofollow'>
    Высокоуровневое абстрактное говно
  • TRIAL

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

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

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

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