将文本中的所有URL替换为PHP中的可单击链接

时间:2016-07-16 18:37:07

标签: php regex url preg-replace

我有一个用PHP编写的Web应用程序。我想在用户评论中找到所有网址,并将其更改为可点击的链接。我搜索了很多网站和页面,发现下面的解决方案(不幸的是我没有找到它的参考链接):

<?php
function convert($input) {
   $pattern = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
   return $output = preg_replace($pattern, '<a href="http$2://$4">$0</a>', $input);
}
?>

这段代码完全归功于它的作者。但我发现其中有一个我无法解决的错误 如果检测到的网址以 s 字母开头(没有https),则 href 值不会包含 s 字符和 http 将更改为 https ,而内部文本是正确的。

示例:
source.com&gt;&gt; <a href="https://ource.com">source.com</a>

您有解决此错误的任何解决方案吗?

2 个答案:

答案 0 :(得分:8)

function convert($input) {
   $pattern = '@(http(s)?://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
   return $output = preg_replace($pattern, '<a href="http$2://$3">$0</a>', $input);
}

<强> demo

答案 1 :(得分:1)

function convert($input) {
   $pattern = '@(http(s)?://)?(([a-zA-Z0-9])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
   return $output = preg_replace($pattern, '<a href="http$2://$3">$0</a>', $input);
}

这是@ splash58花花公子答案的更新,用于处理以数字而非字母开头的网址。例如11hub.net或9gag.com

感谢splash58的最佳答案!