从string中提取url

我试图find一个可靠的解决scheme,从string中提取一个url。 我有一个网站,用户回答问题,并在源框中input信息来源,我允许他们input一个url。 我想提取该url,并使其成为一个超链接。 类似于雅虎的答案。

有谁知道一个可靠的解决scheme,可以做到这一点?

我find的所有解决scheme都适用于某些url,但不适用于其他url。

谢谢

John Gruber 花费了相当多的时间来完善“一个正则expression式来统治它们”来进行链接检测。 使用preg_replace()在其他答案中提到的,使用下面的正则expression式应该是最准确的,如果不是最准确的,检测链接的方法之一:

 (?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); 

雅虎 当链接被正确书写并且与其他文本分开时, 答案在链接标识方面做得相当好,但是在分离标点符号方面并不是很好。 例如The links are http://example.com/somepage.php , http://example.com/somepage2.php , and http://example.com/somepage3.php . 将包括前两个逗号和第三个逗号。

但是,如果这是可以接受的,那么像这样的模式应该这样做:

 \<http:[^ ]+\> 

它看起来像stackoverflow的parsing器更好。 是开源吗?

这段代码适用于我。

 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; }