从字符串中提取URL

问题描述 投票:12回答:5

我正在尝试找到一种可靠的解决方案,以从字符串中提取URL。我有一个站点,用户可以在其中回答问题,并且可以在源框中输入他们的信息源,并允许他们输入网址。我想提取该URL并使其成为超链接。与Yahoo Answers的操作类似。

有人知道一个可靠的解决方案可以做到这一点吗?

我发现的所有解决方案都适用于某些URL,但不适用于其他URL。

谢谢

php regex url preg-replace
5个回答
22
投票

[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`!()\[\]{};:'".,<>?«»“”‘’]))

3
投票
$string = preg_replace('/https?:\/\/[^\s"<>]+/', '<a href="$0" target="_blank">$0</a>', $string);

0
投票

Yahoo!答案


0
投票

[URL中有很多边缘情况。像url可能包含方括号或不包含协议等。这就是为什么regex不够的原因。


-1
投票

此代码对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.