Извлечь URL из строки
Я пытаюсь найти надежное решение для извлечения url из строки символов. У меня есть сайт, на котором пользователи отвечают на вопросы и в исходном поле, где они вводят свой источник информации, я разрешаю им вводить URL-адрес. Я хочу извлечь этот URL-адрес и сделать его гиперссылкой. Подобно тому, как это делает Yahoo Answers.
Кто-нибудь знает надежное решение, которое может это сделать?
Все решения, которые я нашел, работают для некоторого URL-адреса, но не для других.
Спасибо
Ответы
Ответ 1
Джон Грубер провел довольно много времени, улучшив "одно регулярное выражение, чтобы управлять всеми ими" для обнаружения ссылок. Используя preg_replace()
, как упоминалось в других ответах, использование следующего регулярного выражения должно быть одним из самых точных, если не самых точных, способов обнаружения ссылки:
(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»""‘’]))
Если вы хотите только соответствовать HTTP/HTTPS:
(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»""‘’]))
Ответ 2
$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);
Ответ 3
Yahoo! Ответы довольно неплохо выполняют идентификацию ссылок, когда ссылка написана правильно и отделена от другого текста, но не очень хорошо отделяет завершающую пунктуацию. Например, The links are http://example.com/somepage.php, http://example.com/somepage2.php, and http://example.com/somepage3.php.
будет включать запятые в первых двух и период на третьем.
Но если это приемлемо, тогда такие шаблоны должны сделать это:
\<http:[^ ]+\>
Похоже, что анализатор stackoverflow лучше. Является открытым исходным кодом?
Ответ 4
Этот код работает для меня.
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;
}