Поиск e-mail и замена на url

Тема в разделе "Регулярные выражения", создана пользователем s0lo, 29 июн 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. s0lo

    s0lo Создатель

    Регистр.:
    24 дек 2006
    Сообщения:
    47
    Симпатии:
    4
    Помогите решить проблему:
    В произвольном тексте нужно найти e-mail адрес в тексте и заменить его на ссылку типа:
    Код:
    <a href="mailto:е-mail">e-mail</a>
    Делаю так как в коде приведенном ниже, но всё это работает если в тексте попадается просто e-mail и e-mail обрамленный в тэг.
    А хочется, чтобы адреса заключенные в тэг <a href="mailto:е-mail">е-mail</a> не заменялись.
    PHP:
    $str_t "1 адрес <a href=\"#\">a.dd-g@ab-cd_4.com.ru</a> <br>
              2 адрес abc-abc@abcdefg.ru <br>
              3 адрес <a href=\"mailto:abc-abc@abcdefg.ru\">abc-abc@abcdefg.ru</a>"
    ;
        
    $pattern '/([0-9a-z_.-])+@([a-z0-9.-]+.[a-z]{2,4})/is';
        
    $replacement '<a href="mailto:$0">$0</a>';
        echo 
    " результат :<br>".preg_replace($pattern$replacement$str_t);
    т.е. нада чтобы в приведенном примере заменился только 2 адрес, а адреса найденные в остальных строках остались неизменны.
    Помогите советом.
     
  2. SolarWind

    SolarWind Создатель

    Регистр.:
    18 авг 2008
    Сообщения:
    42
    Симпатии:
    11
    можно так...
    PHP:
    <?php
    $str_t 
    "1 адрес <a href=\"#\">a.dd-g@ab-cd4.com.ru</a> <br>
              2 адрес abc-abc@abcdefg.ru <br>
              3 адрес <a href=\"mailto:abc-ab2c@ab2cdefg.ru\">ab2c-abc@ab2cdefg.ru</a>"
    ;
    $email_pattern '[a-z0-9_.-]+@[a-z0-9.-]+\.[a-z]{2,4}';
    $pattern "!(?:<a\s+href\s*=\s*\"mailto:($email_pattern)\">[^<]+</a>|($email_pattern))!is";
    $replacement '<a href="mailto:$1$2">$1$2</a>';
    echo 
    " результат :<br>".preg_replace($pattern$replacement$str_t);
    ?>
     
    s0lo нравится это.
  3. s0lo

    s0lo Создатель

    Регистр.:
    24 дек 2006
    Сообщения:
    47
    Симпатии:
    4
    SolarWind, спасиб, это полностью решило мою проблему, хоть и первый адрес из моего примера всёравно заменяется.
    В который раз убеждаюсь, что регулярки очень удобная и полезная вещь и что нада учиться их составлять.
     
  4. SolarWind

    SolarWind Создатель

    Регистр.:
    18 авг 2008
    Сообщения:
    42
    Симпатии:
    11
    Пожалуйста :)
    Я думал в нем ошибка и убрал из него знак _, видимо поэтому и заменяется... Также обрати внимание, что в регулярке для емэйла, должен стоять слэш пред точкой \. Так как точка без слэша - это произвольный символ, а в любом домене обязательно должна быть точка.

    P.S.
    Упустил из виду, что первый емэйл тоже в виде ссылки, можно такие тоже захватывать похожей регуляркой...
    PHP:
    <?php
    $str_t 
    "1 адрес <a href=\"#\">a.dd-g@ab-cd4.com.ru</a> <br>
              2 адрес abc-abc@abcdefg.ru <br>
              3 адрес <a href=\"mailto:abc-ab2c@ab2cdefg.ru\">ab2c-abc@ab2cdefg.ru</a>"
    ;
    $email_pattern '[a-z0-9_.-]+@[a-z0-9.-]+\.[a-z]{2,4}';
    $pattern "!(?:<a\s+href\s*=\s*\"[^\"]\">($email_pattern)</a>|<a\s+href\s*=\s*\"mailto:($email_pattern)\">[^<]+</a>|($email_pattern))!is";
    $replacement '<a href="mailto:$1$2$3">$1$2$3</a>';
    echo 
    " результат :<br>".preg_replace($pattern$replacement$str_t);
    ?>
     
Статус темы:
Закрыта.