0

我在 php 函数中使用以下正则表达式用正确的 HTML 链接替换 ​​URL:

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>

有谁知道如何修改正则表达式以获得预期的字符串,即

<li><a href="http://www.link.com/something.pdf">http://www.link.com/something.pdf</a></li> ?

不排除由 '%', '?' 引入的 URL 的替换子字符串 或者 '&' ?

4

2 回答 2

0

非常简单的解决方案:

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);
于 2013-01-18T12:54:19.503 回答
0

你 rpattern 是不够的(捕捉所有的链接),但无论如何,而不是\S+你可能想要的,[^\s<>]+因为前者捕捉了所有非空间。

同样适用于[^\.\s]。做这个[^\s<>.]。在字符类中使用时不需要转义点,所以对这个组的添加基本上是大于和小于符号。

于 2013-01-18T13:56:44.140 回答