Php preg_更换的问题

Php preg_更换的问题,php,Php,我使用此功能使链接可单击: function clickable($text) { $text = preg_replace("/(https?|ftps?|mailto):\/\/([-\w\p{L}\.]+)+(:\d+)?(\/([\w\p{L}#-;+-\/_\.]*(\?\S+)?)?)?/u", '<a target="_blank" href="$0">$0</a>', $text); return $text; } 功能可点击($text){

我使用此功能使链接可单击:

function clickable($text) {
   $text = preg_replace("/(https?|ftps?|mailto):\/\/([-\w\p{L}\.]+)+(:\d+)?(\/([\w\p{L}#-;+-\/_\.]*(\?\S+)?)?)?/u", '<a target="_blank" href="$0">$0</a>', $text);
   return $text;
}
功能可点击($text){
$text=preg\u replace(“/(https?| ftps?| mailto):\/([-\w\p{L}.]+)+(:\d+)(\/([\w\p{L}.-;+-\/\u\.]*(\?\ S+)/(“,”,$text);
返回$text;
}
它工作正常,但有一个小问题。如果$text变量包含如下字符串:

一些文本

i、 链接,换行和一些文本,我得到了不正确的结果。与此相反:

<a target="_blank" href="http://example.com">http://example.com</a>

它变成:

<a target="_blank" href="http://example.com<br">http://example.com</a>
/>

some text

/>
一些文本
以下是我在网站上显示文本的方式:

<?php echo clickable(nl2br($db['content'])); ?>

nl2br函数将所有换行符转换为html

标记,但该函数认为应将此标记保留在url中

希望我清楚:)


有什么想法吗?

在模式的末尾,您有
\S+
-这允许所有非空格字符,包括
您有一个带有
[\-+-\\]
的字符类-这是故意的吗?首先,
[#-;]
包含
[+-\\]
,这很奇怪。不,这似乎不是一个好的解决方案。。。例如,如果我删除这个部分,并且utl中有一些特殊符号?或者-只有符号前面的部分显示为url。@Levani-我刚刚解释了导致错误的原因-我已经用可能的解决方案更新了我的答案。请注意,
\S
是一个非常强大的选择器。。。无论如何,我将
(\?\S+)
简化为
[^\S]