2010-08-22 66 views
2

我使用此功能进行链接点击:问题的preg_replace

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; 
} 

它工作正常,但有一个小问题。如果$文本变量包含一个像这样的字符串:

http://example.com

一些文字

即链接,换行符(S)和一些文字,我得到不正确的结果。取而代之的是:

<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 ...

希望我很清楚:)

任何想法?

+0

你有一个字符类'[# - + - \\] ' - 这是故意的吗?首先,'[# - ;]'包含'[+ - \\]',这很奇怪。 – Kobi 2010-08-22 11:33:31

回答

2

在图案的末尾有\S+ - 这允许所有非空格字符,包括<,以及您的正则表达式不能按预期工作的原因。我不太确定那部分的作用是什么,请考虑删除(\?\S+)?,看看它是否适合你。

另一种选择是改变这种组:[^\s<]* - 这不会捕捉空间和<标志,正是解决这个问题...

+0

不,这似乎不是一个好的解决方案...例如,如果我删除了这部分,并且在utl中有一些特殊符号?或者 - 只有该符号之前的部分显示为url。 – 2010-08-22 11:38:10

+0

@Levani - 我只是解释了什么导致你的错误 - 我已经用可能的解决方案更新了我的答案。请注意'\ S'是一个相当强大的选择器......无论如何,我将'(\?\ S +)?'简化为'[^ \ s <] *' - 它包含\反正,'*'似乎更合适这里。 – Kobi 2010-08-22 11:45:34