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

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

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

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

Спасибо

12 голосов | спросил Jack Harvin 8 WedEurope/Moscow2010-12-08T20:44:27+03:00Europe/Moscow12bEurope/MoscowWed, 08 Dec 2010 20:44:27 +0300 2010, 20:44:27

4 ответа


0

Джон Грубер потратил немало времени , совершенствуя «одно регулярное выражение, чтобы управлять ими всеми» "для обнаружения ссылки. Использование 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`!()\[\]{};:'".,<>?«»“”‘’]))
ответил 8 WedEurope/Moscow2010-12-08T21:09:07+03:00Europe/Moscow12bEurope/MoscowWed, 08 Dec 2010 21:09:07 +0300 2010, 21:09:07
0
$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);
ответил Jonah 8 WedEurope/Moscow2010-12-08T20:57:58+03:00Europe/Moscow12bEurope/MoscowWed, 08 Dec 2010 20:57:58 +0300 2010, 20:57:58
0

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

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

\<http:[^ ]+\>

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

ответил wallyk 8 WedEurope/Moscow2010-12-08T20:56:31+03:00Europe/Moscow12bEurope/MoscowWed, 08 Dec 2010 20:56:31 +0300 2010, 20:56:31
0

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

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;
}
ответил Paras Dalsaniya 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 16:27:02 +0300 2015, 16:27:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132