我使用Smarty修饰符将明文链接转换为正确的超链接,我为此使用Smarty修改器,因为它适用于使用用户内容的网站,其中只允许某些区域具有超链接。
这是修改器:
function smarty_modifier_dolink($text)
{
$text = preg_replace('#(script|about|applet|activex|chrome):#is', "\1:", $text);
$ret = ' ' . $text;
$ret = preg_replace("#(^|[n ])([w]+?://[w#$%&~/.-;:=,?@[]+]*)#is", "\1<a href="\2" target="_blank" rel="nofollow">\2</a>", $ret);
$ret = preg_replace("#(^|[n ])((www|ftp).[w#$%&~/.-;:=,?@[]+]*)#is", "\1<a href="http://\2" target="_blank" rel="nofollow">\2</a>", $ret);
//$ret = preg_replace("#(^|[n ])([a-z0-9&-_.]+?)@([w-]+.([w-.]+.)*[w]+)#i", "\1<a href="mailto:\2@\3">\2@\3</a>", $ret);
$ret = substr($ret, 1);
return $ret;
}
?>
修改器的代码已在另一个网站上共享。它工作正常,但当明文链接在括号中时不起作用,如果有任何帮助,我们将不胜感激,谢谢!
一个提取的PCRE正则表达式:
(^|[n ])(?((www|ftp).[w#$%&~/.-;:=,?@[]+]*))?
regex在带有url的regex101.com上测试(www.example.com/test/test.html(
集合组2->www.example.com/test/test.html
因此,以下内容应该有效:
$ret = preg_replace("#(^|[n ])(?((www|ftp).[w#$%&~/.-;:=,?@[]+]*))?#is", "\1<a href="http://\2" target="_blank" rel="nofollow">\2</a>", $ret);
$ret=preg_replace("#(^|[\n]((?([\w]+?://[\w#$%&~/.-;:=,?@[]+]*((?#是","\1<a href="\2&"target="_blank&"rel="nofollow">\2&;,$ret(;
说明:我添加了
)?
/) for a bracket and ? for optional at the positions where i suggested your brackets to be.