我在php函数中使用以下regexp将url替换为正确的HTML链接:
return preg_replace('@(https?://([-'w'.]+[-'w])+(:'d+)?(/(['w/_'.#-]*('?'S+)?[^'.'s])?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
但是当$s的值是像
这样的字符串时<li>http://www.link.com/something.pdf</li>
函数返回
<li><a href="http://www.link.com/something.pdf</li">http://www.link.com/something.pdf</li></a></li>
有没有人知道如何修改regexp以获得预期的字符串,即
<li><a href="http://www.link.com/something.pdf">http://www.link.com/something.pdf</a></li> ?
不排除由'%','? '引入的URL的替换子字符串'或'&' ?
非常简单的解决方案:
return '<li>'.preg_replace('@(https?://([-'w.]+[-'w])+(:'d+)?(/(['w-.~:/?#'[']'@!$&''()*+,;=%]*)?)?)@', '<a href="$1" target="_blank">$1</a>', $s).'</li>';
如果你真的想要一个正则表达式:
return preg_replace('@(https?://([-'w.]+[-'w])+(:'d+)?(/(['w-.~:/?#'[']'@!$&''()*+,;=%]*)?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
您的rpattern不足以(捕获所有链接),但无论如何,您可能希望使用[^'s<>]+
而不是'S+
,因为前者捕获所有非空格的内容。
同样适用于[^'.'s]
。做成[^'s<>.]
。当在字符类中使用时,您不需要来转义点,因此我添加到这一组的基本是大于和小于符号。