我正在尝试找到一个可靠的解决方案,从一串字符中提取网址。我有一个用户回答问题的网站,在源框中,他们输入了他们的信息来源,我允许他们输入网址。我想提取该URL并使其成为超链接。与Yahoo Answers的工作方式类似。
有没有人知道可以做到这一点的可靠解决方案?
我找到的所有解决方案都适用于某些网址但不适用于其他网址。
由于
答案 0 :(得分: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`!()\[\]{};:'".,<>?«»“”‘’]))
答案 1 :(得分:3)
$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);
答案 2 :(得分:1)
有很多带有网址的极端情况。像url可能包含方括号或不包含协议等。这就是为什么regex不够的原因。
我创建了一个PHP库,可以处理许多极端情况:Url highlight。
您可以从字符串中提取网址或直接突出显示它们。
示例:
<?php
use VStelmakh\UrlHighlight\UrlHighlight;
$urlHighlight = new UrlHighlight();
// Extract urls
$urlHighlight->getUrls("This is example http://example.com.");
// return: ['http://example.com']
// Make urls as hyperlinks
$urlHighlight->highlightUrls('Hello, http://example.com.');
// return: 'Hello, <a href="http://example.com">http://example.com</a>.'
答案 3 :(得分:0)
雅虎!当链接被正确编写并与其他文本分开时,答案可以很好地完成链接识别,但它不能很好地分离尾随标点符号。例如,The links are http://example.com/somepage.php, http://example.com/somepage2.php, and http://example.com/somepage3.php.
将包含前两个逗号和第三个逗号。
但如果这是可以接受的,那么这样的模式就应该这样做:
\<http:[^ ]+\>
看起来stackoverflow的解析器更好。是开源吗?
答案 4 :(得分:-1)
此代码适用于我。
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;
}