用php查找字符串中的url

时间:2012-02-05 18:14:24

标签: php

以下代码用于从php中查找字符串中的url。这是代码:

$string = "Hello http://www.bytes.com world www.yahoo.com";
preg_match('/(http:\/\/[^\s]+)/', $string, $text);
$hypertext = "<a href=\"". $text[0] . "\">" . $text[0] . "</a>";
$newString = preg_replace('/(http:\/\/[^\s]+)/', $hypertext, $string);
echo $newString;

嗯,它显示了一个链接,但如果我提供的链接很少,它就不起作用,如果我没有http://写,那么它不会显示链接。我想要提供的任何链接都应该是活动的,比如stackoverflow.com。

任何帮助请...

3 个答案:

答案 0 :(得分:17)

与http / https / ftp / ftps / scp / scps链接的工作方法: $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?&_/]+!', "<a href=\"\\0\">\\0</a>",$str);

我强烈建议不要在它只有一个点时链接,因为它会考虑PHP 5.2,ASP.NET等链接,这是难以接受的。

更新:如果你想要www。字符串也是如此,请查看this

答案 1 :(得分:3)

如果您想检测stackoverflow.com之类的内容,那么您将需要检查所有可能的顶级域名,以排除类似Web 2.0的内容,这非常long list。不过,这也与ASP.NET等匹配。

正则表达式看起来像这样:

$hypertext = preg_replace(
    '{\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net)\b}mi',
    '<a href="http://$1$2$3">$1$2$3</a>',
    $text
);

这只匹配以.com,.org和.net结尾的域名...如前所述,您必须扩展此列表以匹配所有TLD

答案 2 :(得分:0)

@axiomer如果链接格式为

,那么你的例子就不起作用了

https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl

正确的解决方案:

preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?%=&_/]+!', "<a href=\"\\0\">\\0</a>", $content);

产生

<a href="https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl">https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl</a>