PHP – функция поиска ссылок в тексте

У меня есть функция, которая преобразует строки, такие как «www.example.com» и « http://example.com » в гиперссылки. Он также касается субдоменов, например « http://sub.example.com ».

Но это не удается с этим – http: // www .example.com 'и выводит следующие

<a href="http://<a href="http://www.chemica.ru">www.chemica.ru</a>">http://<a href="http://www.chemica.ru">www.chemica.ru</a></a> 

Пожалуйста, может кто-нибудь помочь? Проблема в том, что и «http: //», и «www». вместе, и оба имеют разные способы преобразования.

 function makeLinks($text){ $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '<a href="\\1">\\1</a>', $text); $text = eregi_replace('(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '<a href="http://\\1">\\1</a>', $text); $text = eregi_replace('([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[az]{2,3})', '<a href="mailto:\\1">\\1</a>', $text); return $text; } 

просто напишите на страницу вашего просмотра (вам не нужна какая-либо библиотека или вспомогательная функция):

 $text = "Good Site is http://masalahkita.com"; $link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text); echo $link; 

Возможно, вы захотите прочитать это сообщение в блоге Яна Гойваертса для некоторых идей о том, как найти URL-адреса в тексте.

Чтобы решить вашу непосредственную проблему, вы можете добавить отрицательный lookbehind ко второму регулярному выражению: (?<!http://)(www.[-a-zA-Z0-9@:%_\+.~#?&/=]+) гарантирует, что www... будет соответствовать только, если ему не предшествует http:// .

Однако функции ereg устарели и не поддерживают поиск, поэтому вам нужно будет использовать preg_replace() .

 $text = preg_replace('/(?<!http:\/\/)(www.[-a-zA-Z0-9@:%_\+.~#?&\/=]+)/i', '<a href="http://\1">\1</a>', $text); 

должно сработать.

Для 'http://' и 'www.' вместе вы можете сделать что-то вроде этого :

 $text = "http://www.example.com is a nice site"; $link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text); echo $link; 

Работы для URL-адресов начинаются с http: //