Извлечь URL из строки

Я пытаюсь найти надежное решение для извлечения url из строки символов. У меня есть сайт, на котором пользователи отвечают на вопросы и в исходном поле, где они вводят свой источник информации, я разрешаю им вводить URL-адрес. Я хочу извлечь этот URL-адрес и сделать его гиперссылкой. Подобно тому, как это делает Yahoo Answers.

Кто-нибудь знает надежное решение, которое может это сделать?

Все решения, которые я нашел, работают для некоторых URL-адресов, но не для других.

благодаря

Solutions Collecting From Web of "Извлечь URL из строки"

Джон Грубер потратил немало времени на совершенствование «одного регулярного выражения для управления всеми» для обнаружения ссылок. Используя preg_replace() как указано в других ответах, использование следующего регулярного выражения должно быть одним из самых точных, если не самых точных, способов обнаружения ссылки:

 (?i)\b((?:[az][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”''])) 

Если вы хотите только соответствовать HTTP / HTTPS:

 (?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”''])) 
 $string = preg_replace('/https?:\/\/[^\s"<>]+/', '<a href="$0" target="_blank">$0</a>', $string); 

Он соответствует только http / https, но это действительно единственный протокол, который вы хотите превратить в ссылку. Если вы хотите других, вы можете изменить его следующим образом:

 $string = preg_replace('/(https?|ssh|ftp):\/\/[^\s"]+/', '<a href="$0" target="_blank">$0</a>', $string); 

Yahoo! Ответы довольно неплохо выполняют идентификацию ссылок, когда ссылка написана правильно и отделена от другого текста, но не очень хорошо отделяет завершающую пунктуацию. Например, The links are http://example.com/somepage.php , http://example.com/somepage2.php , and http://example.com/somepage3.php . будет включать запятые в первые два и период на третьем.

Но если это приемлемо, тогда такие шаблоны должны сделать это:

 \<http:[^ ]+\> 

Похоже, что синтаксический анализатор stackoverflow лучше. Является открытым исходным кодом?

Этот код работает для меня.

 function makeLink($string){ /*** make sure there is an http:// on all URLs ***/ $string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2",$string); /*** make all URLs links ***/ $string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>",$string); /*** make all emails hot links ***/ $string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>",$string); return $string; }