在 PHP 中将纯文本 URL 转换为 HTML 超链接

2022-08-30 09:13:40

我有一个简单的评论系统,人们可以在纯文本字段中提交超链接。当我将这些记录从数据库显示回网页时,我可以使用PHP中的哪个RegExp将这些链接转换为HTML类型的锚点链接?

我不希望算法使用任何其他类型的链接来做到这一点,只是http和https。


答案 1

这是另一个解决方案,这将捕获所有http / https / www并转换为可点击的链接。

$url = '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i'; 
$string = preg_replace($url, '<a href="$0" target="_blank" title="$0">$0</a>', $string);
echo $string;

或者,对于仅捕获http / https,请使用下面的代码。

$url = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/';   
$string= preg_replace($url, '<a href="$0" target="_blank" title="$0">$0</a>', $string);
echo $string;

编辑:下面的脚本将捕获所有URL类型并将其转换为可点击的链接。

$url = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;

新的更新,如果您让字符串剥离(s),请使用下面的代码块,感谢@AndrewEllis指出这一点。

$url = '@(http(s)?)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$string = preg_replace($url, '<a href="http$2://$4" target="_blank" title="$0">$0</a>', $string);
echo $string;

这是一个非常简单的解决方案,用于解决URL无法正确显示的问题。

$email = '<a href="mailto:email@email.com">email@email.com</a>';
$string = $email;
echo $string;

这是一个非常简单的修复程序,但您必须出于自己的目的对其进行修改。

我已经提供了多个答案,因为一些服务器的设置不同,所以一个答案可能对某些人有效,但对其他人不起作用,但我希望答案对您有用,如果没有,请告诉我,希望我能想出另一种解决方案。

有多个脚本,因为一些PHP文件需要不同的脚本,有些服务器也有不同的设置,加上每个服务器都有不同的要求,有些只想要HTTP / S,有些想要WWW,有些想要FTP / S,每个脚本都会根据用户自己的脚本的设置方式工作,我为每个脚本提供了一些文本,其中包含它们的作用。


答案 2

好吧,Volomike的答案更接近。为了进一步推动它,以下是我为它所做的,以忽略超链接末尾的尾随句点。我还考虑了URI片段。

public static function makeClickableLinks($s) {
  return preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
}

推荐