从字符串中提取URL

时间:2010-12-08 17:44:28

标签: php regex url preg-replace

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

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

我找到的所有解决方案都适用于某些网址但不适用于其他网址。

由于

5 个答案:

答案 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>.'

有关更多详细信息,请参见readme。有关覆盖的网址情况,请参见test

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