2010-12-06 33 views
0

我在PHP中將此代碼轉換爲文本內的URL到活動html鏈接。將URLS轉換爲與REGEX的活動鏈接

例如,在一個字符串

Hey check this cool link http://www.example.com 

這種轉變爲:

Hey check this cool link <a href="http://www.example.com">http://www.example.com</a>

正如你可以看到它只是增加正確<一> HTML標籤

的代碼這個:

$active_links_text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\">\\0</a>", $original_text); 

我的問題是,如何做到這一點工作除了如果URL是一個YouTube網址。

所以我想這樣的結果:在一個字符串

Wow have you checked http://www.youtube.com/watch?v=dQw4w9WgXcQ its even better than http://www.example.com !!! 

我想轉化爲

Wow have you checked http://www.youtube.com/watch?v=dQw4w9WgXcQ its even better than <a href="http://www.example.com">http://www.example.com</a> 

正如你可以看到<一> HTML標記添加到example.com的網址,但不在YouTube的網址。

我該如何做到這一點?

我希望我描述我的問題夠好,我希望它很容易實現這個!最後說明:我在php 5.2.14中使用此代碼

謝謝各位!

+0

我想你應該構造成URL屬性,以匹配`http` URL,如[spec](http://www.ietf.org/rfc/rfc1738.txt)中所述。特別是,你的正則表達式不匹配`?`。另外,可能有'&`,`#`...... – khachik 2010-12-06 15:02:20

回答

0

[編輯:哇,我已經得到你的問題完全錯誤!下面是一個更好的嘗試來幫助你。]

我給它在js here去,這裏是原始正則表達式:/(http:\/\/(?!www.youtube)[^<>\s]+)\b/g,因爲我不是一個PHP編碼器。負向預覽阻止了一個litteral的www.youtube比賽(如果需要更復雜的模式,可以調整預覽內容)。

這裏沒有任何js特定於我的知識,但我不知道ereg正則表達式的語法。與preg函數,你只需要不要逃避斜線,單詞界限\b和負向預測(?!*pattern*)是相同的。 /g標誌用於全局替換,即不停止第一次匹配,我想你的工具箱中有一種replaceAll函數。

另外,我不確定在php中的全局標誌,我想你可以調用一種replaceAll函數。

0

您對有效的URI組件犯了幾個錯誤。該方案定義爲ALPHA *(ALPHA/DIGIT/"+"/"-"/"."),而不是[[:alpha:]]+

該方案的:之後的部分不需要以//開始,這對於http:和其他一些面向文件的方案是特別的。但是你的正則表達式的[[:alpha:]]+:開始表明你並不想將自己限制爲http:。在這種情況下,所有可打印的ASCII字符都是有效的。即作爲正則表達式,從!~[\x21-x7E]*。總結:[[:alpha:]][A-Za-z0-9+-.]*:[\x21-x7E]*