以下代码用于从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。
任何帮助请...
答案 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>