2013-01-19 64 views
0

我使用以下模式拍攝的鏈接,並將其轉化爲HTML友好的聯繫。我在preg_replace_callback中使用以下模式,並且大部分工作。preg_replace_callback模式問題

"#(https?|ftp)://(\S+[^\s.,>)\];'\"!?])#" 

但當文本讀取像這樣這種模式失敗:

http://mylink.com/page[/b] 

在該點它捕獲[/ B會哄它是鏈路的一部分,從而導致在這樣的:

<a href="http://woodmill.co.uk[/b">woodmill.co.uk[/b</a>] 

我過目模式,並使用了一些作弊表,試圖跟着發生了什麼,但它已經大感迷惑我。你們誰可以編碼忍者的幫助嗎?

+0

你能在平實的語言您匹配的標準是什麼解釋?您是否打算簡單地捕獲URL的部分,直到存在非法字符(即URL中不允許),因爲您的URL不一定具有空格後面的空格? –

+0

@MikeBrant簡單來說,我只想捕捉一個url,只要它不以句號或逗號結尾。所以http://mydomain.com/page會很好,但是http://mydomain.com/page。會失敗。它的目的是成爲一個CMS的一部分,我也張貼了這個問題(DOH!)中,我發現這個問題的一個新的長度模式的形式後不久,找到一個解決方案:[鏈接](HTTP://計算器。com/questions/12352635/making-a-url-regex-global/14410248#14410248) – mattauckland

+0

你應該回答你的問題**到你的問題**,而不是別人的問題。 – JDB

回答

0

好吧,我解決了這個問題。感謝@ Cyborgx37和@MikeBrant的幫助。這是解決方案。

首先我替換爲若昂卡斯特羅在這個問題中使用的我的正則表達式模式:Making a url regex global

與該模式的問題是它捕獲在端部的任何尾隨的點,所以在圖案的最後一節我添加^.使最後的部分看起來像這樣[^\s^.]。當我閱讀它時,不要匹配尾部空格或點。

這仍然引起如我上面提到的匹配的bbcode一個問題,所以就用preg_replace_callback()和create_function()過濾出來。最後create_function()看起來是這樣的:

create_function('$match',' 
       $match[0] = preg_replace("/\[\/?(.*?)\]/", "", $match[0]); 
       $match[0] = preg_replace("/\<\/?(.*?)\>/", "", $match[0]); 
       $m = trim(strtolower($match[0])); 
       $m = str_replace("http://", "", $m); 
       $m = str_replace("https://", "", $m); 
       $m = str_replace("ftp://", "", $m); 
       $m = str_replace("www.", "", $m); 

       if (strlen($m) > 25) 
       { 
        $m = substr($m, 0, 25) . "..."; 
       } 

       return "<a href=\"$match[0]\" target=\"_blank\">$m</a>"; 
'), $string); 

測試到目前爲止正在尋找好的,所以我很高興它現在解決了。

再次感謝,我希望這可以幫助別人:)

0

嘗試添加左方括號,以你的性格類:

(\S+[^\s.,>)[\];'\"!?]) 
      ^

UPDATE

嘗試這種更有效的URL正則表達式:

^(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w \.-]*)*/?$ 

(來源:http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/

我直接用PHP正則表達式的經驗,但上面是簡單和通用,以至於我不希望任何問題。您可能需要修改它以提取域,就像您使用當前的正則表達式一樣。

+0

即使不起作用,仍會導致相同的問題。 – mattauckland

+0

@mattauckland - 更新了答案。 – JDB