Регулярное выражение для подстановки mailto: PHP

Рейтинг: 1Ответов: 1Опубликовано: 11.09.2014

Привет.

Не могу разобраться с регуляркой. Ее задача - парсить текст и заменять попавшиеся email адреса ссылками mailto:

$text = preg_replace("#(^|[\n ])([\w0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#iu", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $text);

Все работает, только когда перед адресом есть какие-нибудь символы. Например:

test@test.com - не работает.

test test@test.com - работает.

UPD: Дело оказалось в том, что предварительный фильтр строки добавляет в нее <p> вначале. Я не очень силен в регулярках, поэтому дополнительно поинтересуюсь, является ли такое решение проблемы нормальным:

(^|>|[\n ])([\w0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)

Ответы

▲ 2Принят

Вместо:

(^|[\n ])

лучше использовать:

\b

После собаки у тебя используется "\w", которое включает и "_", чего в доменах нет.
Попробуй что-нибудь попроще, например так:

\b([\w-]+@[a-z0-9-.]+)\b

А вообще, есть тонны готовых регулярок в сети.