2011-09-01 130 views
0

我使用preg_replace和數組來通過我的bbcode並在發佈新聞條目時進行更改。根據url值更改bbcode

例如

$bbcode = array (
    "/\[url\=(.*?)\](.*?)\[\/url\]/is" => "<a href='$1' target='_blank'>$2</a>" 
); 

所以後來當我拉數據庫中的數據(在這個例子$ newsPost),其中包含文本和設置高亮,我這樣做。

$newsPost = preg_replace(array_keys($bbcode), array_values($bbcode), $newsPost); 

現在,我想是找出是否$ 1的值包含我的域名,目標應該是「頂」,如果不是,它應該是空白。

所以,如果我們有[url=http://www.mydomain.com]visit our page[/url]。那麼它會變成<a href="http://www.mydomain.com" target="top">visit our page</a>,其他任何東西都會變成target="_blank"

任何想法?

在此先感謝!

回答

1

編輯/ FIXED

  • 新增str_replace()處理點在域名
  • 起初,我定你的反斜槓(如果你想在你的正則表達式反斜槓應該\\字符串中)但我已經解決了這個問題,正如你所說的那樣,它首先是爲你工作的。

這個怎麼樣?

$mydomain = 'domain.tld'; 
$bbcode = array (
    "/\[url\=([^]]*)(".str_replace('.','\\.',$mydomain).")([^]]*)\]([^[]*)\[\/url\]/is" => "<a href='$1$2$3' target='top'>$4</a>", 
    "/\[url\]([^[]*)(".str_replace('.','\\.',$mydomain).")([^[]*)\[\/url\]/is" => "<a href='$1$2$3' target='top'>$1$2$3</a>"; 
    "/\[url\=([^]]*)\]([^[]*)\[\/url]/is" => "<a href='$1' target='_blank'>$2</a>" 
    "/\[url\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$1</a>", 
); 

如果這會爲你工作,一個警告:不要設置$mydomainwww.domain.tld,將其設置爲domain.tld,讓您捕捉到所有的子域。

你甚至可以用這樣的多個域做到這一點:

$mydomains = array(
    'domain.tld', 
    'anotherdomain.tld', 
    'sub.yetanotherdomain.tld' 
); 

// Add domain-specific rules before general rules so we don't match domain 
// specific links with the general link rule (we have replaced them by that point) 
$domainrules = array(); 
foreach ($mydomains as $domain) { 
    $domainrules["/\[url\=([^]]*)(".str_replace('.','\\.',$domain).")([^]]*)\]([^[]*)\[\/url\]/is"] = "<a href='$1$2$3' target='top'>$4</a>"; 
    $domainrules["/\[url\]([^[]*)(".str_replace('.','\\.',$domain).")([^[]*)\[\/url\]/is"] = "<a href='$1$2$3' target='top'>$1$2$3</a>"; 
} 

// This array contains all your static BBCode rules 
$staticrules = array(
    "/\[url\=([^]]*)\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$2</a>", 
    "/\[url\]([^[]*)\[\/url\]/is" => "<a href='$1' target='_blank'>$1</a>", 
    "/\[b\]([^[]*)\[\/b\]/is" => "<span class='bold_text'>$1</span>", 
    ... 
); 

// Make an array that contains all the rules 
$bbcode = array_merge($staticrules,$domainrules); 
+0

完美地工作!謝謝。對第二個例子有點不確定。如果我在bbcode(20+)中有很多項目,我將不得不重寫每個以適合$ bbcode []樣式? – Andelas

+1

@scatteredbomb不,你可以使用[array_merge()](http://www.php.net/manual/en/function.array-merge.php),看到我更新的答案 – DaveRandom

+0

@scatteredbomb只是再次編輯,我只是意識到你需要爲使用'[url] http://my.url/ [/ url]'語法的人以及'[url = http://my.url/]一些文本[/ url] ' – DaveRandom