Preg用链接替换URL: MIME类型失败


Preg replace URL with links: MIME types failure

我在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<>.]。当在字符类中使用时,您不需要来转义点,因此我添加到这一组的基本是大于和小于符号。