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