2012-02-25 60 views
0

我正在尋找漂亮的正則表達式這將改變我的字符串:PHP:正則表達式來更改網址

text text website.tld text text anotherwebsite.tld/longeraddress text http://maybeanotheradress.tld/file.ext 

到bbcodes

text text [url=website.tld]LINK[/url] text text [url=anotherwebsite.tld/longeradress]LINK[/url] text text [url=http://maybeanotheradress.tld/file/ext]LINK[/url] 

能否請你指教?

+0

您如何區分網站地址和文字? – 2012-02-25 15:08:45

+0

首先我要說的是用分隔符分割字符串:「:」,「 - 」和空格鍵 – 2012-02-25 15:15:33

+1

@AdrianK。 「hi.com白衣我」(寫得不好的短語的例子)。根據你當前的規則,'hi.com'應該被解釋爲一個URL。我建議強制URL以協議爲前綴。的[查找網頁鏈接,並通過自定義函數運行] – 2012-02-25 15:20:13

回答

2

即使我投了兩份,一般建議:分而治之

在你輸入的字符串,所有的「網址」不包含任何空格。所以,你可以把字符串轉換爲不包含空格的部分:

$chunks = explode(' ', $str); 

我們知道,每一個部分,現在是一個潛在的鏈接您可以創建自己的功能,即能有這麼:

/** 
* @return bool 
*/ 
function is_text_link($str) 
{ 
    # do whatever you need to do here to tell whether something is 
    # a link in your domain or not. 

    # for example, taken the links you have in your question: 

    $links = array(
     'website.tld', 
     'anotherwebsite.tld/longeraddress', 
     'http://maybeanotheradress.tld/file.ext' 
    ); 

    return in_array($str, $links); 
} 

in_array只是一個例子,您可能正在尋找基於正則表達式的模式匹配。您可以稍後進行編輯以適應您的需求,我將此作爲練習。

正如你現在可以說什麼環節,什麼不可以,唯一剩下的問題是如何創建的BBCode了鏈接,這是一個相當簡單的字符串操作:

if (is_link($chunk)) 
{ 
    $chunk = sprintf('[url=%s]LINK[/url]', $chunk); 
} 

所以從技術上說,所有問題已經解決,這需要被放在一起:

function bbcode_links($str) 
{ 
    $chunks = explode(' ', $str); 
    foreach ($chunks as &$chunk) 
    { 
     if (is_text_link($chunk)) 
     { 
      $chunk = sprintf('[url=%s]LINK[/url]', $chunk); 
     }    
    } 
    return implode(' ', $chunks); 
} 

這已經與有關您的示例字符串(Demo)運行210

輸出:

text text [url=website.tld]LINK[/url] text text [url=anotherwebsite.tld/longeraddress]LINK[/url] text [url=http://maybeanotheradress.tld/file.ext]LINK[/url] 

然後你只需要調整is_link功能fullfill您的需求。玩的開心!