2010-08-22 97 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