preg_replace的问题

时间:2010-08-22 11:16:03

标签: 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变量包含这样的字符串:

  

http://example.com

     

一些文字

即。链接,换行符和一些文字,我得到错误的结果。而不是:

<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 <br />标记,但此函数认为它应该将此标记保留在url中...

希望我很清楚:)

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在您的模式结束时,您有\S+ - 这允许所有非空格字符,包括<,以及您的正则表达式无法按预期工作的原因。我不太确定该部分的作用是什么,请考虑删除(\?\S+)?并查看它是否适合您。

另一种选择是将该组更改为:[^\s<]* - 这不会捕获空格和<符号,正好解决了这个问题......