Laravel 将字符串转换为可点击的链接

Laravel convert strings to clickabe links

我正在尝试将我的描述栏中的 linksmail addressesnumbers 转换为 link,但我只能让其中的 1 个在时间,我要找的是 preg_replace 多个条件的解决方案。

这是我目前将 link 转换为可点击的 a 标签的方法:

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

Logic

  1. 如果说明有 link 转换为可点击 (http/https)
  2. 如果说明中有邮件地址转换为可点击 (mailto)
  3. 如果描述有数字转换为可点击(电话)

假设我的数据库中有以下字符串(描述列)

http://google.com

tester@gmail.com

+1818254545400

我从该字符串中得到的结果如下(基于我上面的代码)

Screenshot

有什么想法吗?

例如,您可以使用一种方法,该方法使用具有 3 个捕获组的模式,每个选项一个。

然后使用 preg_match_callback 检查组值,并根据该值确定替换。

(https?://\S+)|([^\s@]+@[^\s@]+)|(\+\d+)

当然,您可以根据自己的喜好为群组创建特定的模式。

Regex demo | PHP demo

function getDescriptionAttribute($string) {
    $pattern = "~(https?://\S+)|([^\s@]+@[^\s@]+)|(\+\d+)~";
    
    return preg_replace_callback($pattern, function($matches) {
        
        $template = '<a href="%1$s%2$s" rel="noopener nofollow" target="_blank">%2$s</a>';
        
        if ($matches[1] !== "") return sprintf($template, "", $matches[1]);        
        if ($matches[2] !== "") return sprintf($template, "mailto:", $matches[2]);        
        if ($matches[3] !== "") return sprintf($template, "tel:", $matches[3]);
    }, $string);    
}

$str = 'http://google.com
tester@gmail.com
+1818254545400';

echo getDescriptionAttribute($str);

输出

<a href="http://google.com" rel="noopener nofollow" target="_blank">http://google.com</a>
<a href="mailto:tester@gmail.com" rel="noopener nofollow" target="_blank">tester@gmail.com</a>
<a href="tel:+1818254545400" rel="noopener nofollow" target="_blank">+1818254545400</a>