Регулярное выражение, выделение всех url на странице

Talker

Новичок
Регулярное выражение, выделение всех url на странице

Есть текст с url-ами (без тэгов). Нужно все url выделить, не выделяя e-mail-ы
Делаю так
PHP:
$text = preg_replace("#((?<!@)(http:\/\/)?(www\.)?([^\/@]+\.[a-z]{2,4}[^\s<>@]*))#i", "<u>\\1</u>", $text);
url-ы выделяются, но вместе с ними выделяются и окончания e-mail, претензия срабатывает только на один символ: aaaaaa@yandex.ru
Подскажите, как это решить?
 

Talker

Новичок
Beavis, матчасть я знаю. Туплю на конкретной задаче. Ещё раз поясню. Если в строке встречается просто "yandex.ru", то он должен выделиться <u></u>. Если это не просто посыл в яндекс, а e-mail [email protected], то он не должен выделяться <u></u>.
Ежу понятно, что если сделать обязательным http://, то никакие дополнительные проверки не нужны. Но http может не быть, а всё равно это url.
 

Talker

Новичок
Собственно, я пытаюсь использовать (?<!@), но это не помогает (см.выше). Как правильно записать претензию?
 

tashkentchi

Новичок
Автор оригинала: Talker
Но http может не быть, а всё равно это url.
URL без http, - это не URL. Это - просто название сайта. Причем назвать сайт можно не только как yandex.ru, но и как яндекс.ру, и как Яндекс, и как Яндых... Не возьмешься же ты отлавливать все упоминания любых сайтов? Поэтому, наверное, имеет смысл ограничить задачу выделением только урлов.
 

Talker

Новичок
Автор оригинала: tashkentchi
Не возьмешься же ты отлавливать все упоминания любых сайтов?
Именно это нужно. Точнее. отловить адреса упоминаемых сайтов.

Нашёл некрасивое решение.
После замены делаю ещё один replace - "#@<u>([^\s]+)</u>#i", "@\\1"
 
Сверху