我正在尝试找到一种可靠的解决方案,以从字符串中提取URL。我有一个站点,用户可以在其中回答问题,并且可以在源框中输入他们的信息源,并允许他们输入网址。我想提取该URL并使其成为超链接。与Yahoo Answers的操作类似。
有人知道一个可靠的解决方案可以做到这一点吗?
我发现的所有解决方案都适用于某些URL,但不适用于其他URL。
谢谢
[John Gruber使spent a fair amount of time完善了“一个正则表达式来统治所有规则”以进行链接检测。使用其他答案中提到的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`!()\[\]{};:'".,<>?«»“”‘’]))
$string = preg_replace('/https?:\/\/[^\s"<>]+/', '<a href="$0" target="_blank">$0</a>', $string);
Yahoo!答案
[URL中有很多边缘情况。像url可能包含方括号或不包含协议等。这就是为什么regex不够的原因。
此代码对我有用。