我们使用以下正则表达式将文本中的 URL 转换为链接,如果它们太长,则在中间用省略号缩短:
/**
* Replace all links with <a> tags (shortening them if needed)
*/
$match_arr[] = '/((http|ftp)+(s)?:\/\/[^<>\s,!\)]+)/ie';
$replace_arr[] = "'<a href=\"\\0\" title=\"\\0\" target=\"_blank\">' . " .
"( mb_strlen( '$0' ) > {$maxlength} ? mb_substr( '$0', 0, " . ( $maxlength / 2 ) . " ) . '…' . " .
"mb_substr( '$0', -" . ( $maxlength / 2 ) . " ) : '$0' ) . " .
"'</a>'";
这是有效的。但是,我发现如果文本中已经存在链接,例如:
$text = '... <a href="http://www.google.com">http://www.google.com</a> ...';
它将匹配两个URL,因此它会尝试再创建两个<a>
标签,当然会完全弄乱 DOM。
<a>
如果链接已经在标签内,如何防止正则表达式匹配?它也将在title
属性中,所以基本上我只想<a>
完全跳过每个标签。