2011-04-25 26 views
0
function makeLinks($text) { 
    $text = preg_replace('%(?<!href=")(((f|ht){1}(tp://|tps://))[-a-zA-^[email protected]:\%_\+.~#?&//=]+)%i', 
    '<a href="\\1">\\1</a>', $text); 
    $text = preg_replace('%([:space:]()[{}])(www.[[email protected]:\%_\+.~#?&//=]+)%i', 
    '\\1<a href="http://\\2">\\2</a>', $text); 

     return $text; 
} 

它會錯過,如果我有這樣的事情:- www.website.org(連字符然後一個空格)在一行的開始。如果我有 - www.website.org - www.website.org它捕獲第二個。鏈接轉換pregmatch使用markdown

難道不應該在第二preg_replace的空間被覆蓋?

我也試過%(\s\n\r(){})

我運行它通過降價,但不至後(markdown(makeLinks($foo))),所以我認爲不應該干涉,但是當我把降價關閉,一切都只是回聲出一行它確實使鏈接脫離它們。如果我把makeLinks(markdown($foo))的行爲與最初一樣......不要在列表項的開頭建立以www開頭的鏈接。

+1

是不是'([[:空間:](){}])'畸形,與缺少']'? – 2011-04-25 15:07:15

+0

我也嘗試添加對應]結束之前'字符類右)',但它實際上並沒有改變結果.. – Damon 2011-04-25 15:19:14

+0

所以你就把它改成了'([[:空間](){}])' ?相當醜陋......那裏的'()'和'[{}]'有什麼意義呢?那麼,如果整件事是一個字符類? – 2011-04-25 15:26:13

回答

0

那是一些非常狡猾的正則表達式在那裏工作。這是一個正則表達式,我會建議,而不是用於URL dectection:

%(?<!href="?)(((f|ht)(tp://|tps://))?[a-zA-Z0-9-].[-a-zA-^[email protected]:\%_\+.~#?&//=]+)%i 

應該有很多比你現在有兩個更可靠。

+0

我知道這是騙人......你看起來比周圍更清潔什麼我是肯定的,但它仍然沒有執行任何破越好..它仍然留在那些線條 – Damon 2011-04-25 19:07:06

+0

的開始你能提供一些測試數據針對其運行? – 2011-04-25 19:43:50