Подтвердить что ты не робот

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

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

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

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

Спасибо

4b9b3361

Ответ 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;
}