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

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

12 голосов
/ 08 декабря 2010

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

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

Все найденные мной решения работают для одних URL, но не для других.1006 * Спасибо

Ответы [ 4 ]

22 голосов
/ 08 декабря 2010

Джон Грубер потратил изрядное количество времени , совершенствуя "одно регулярное выражение, чтобы управлять ими всеми" для обнаружения ссылок. Использование 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`!()\[\]{};:'".,<>?«»“”‘’]))
3 голосов
/ 08 декабря 2010
$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);
0 голосов
/ 30 сентября 2015

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

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;
}
0 голосов
/ 08 декабря 2010

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

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

\<http:[^ ]+\>

Это выглядиткак парсер stackoverflow лучше.Является ли это открытым исходным кодом?

...