2013-01-18 13 views
1

有沒有辦法在PHP中搜索像[b][/b]這樣的bbcode。一種剝離不完整bbcode的方法?

例如,他們沒有結束標籤?假設用於在電子郵件訂閱中顯示文字回覆的摘要,請將其剪下至x characters可能會中斷BB-Code將其打開?

與PHP一起使用。

+1

這是不容易的 - 例如考慮這個代碼:'我的文字[B]粗體字[B]更爲大膽的文字[/ B]'。什麼應該是大膽的文字,什麼不應該?應該是'我的文本[b]粗體文本[b]更粗體文本[/ b] [/ b]','我的文本[b]粗體文本[/ b] [b]更粗體文本[/ b]'或'我的文字粗體文本[b]更粗體文本[/ b]'? – h2ooooooo

回答

1

你可以Parse bbcode字符串。它非常複雜,但您可以實施樸素算法來提供句法分析。這樣,你就可以得到像在標籤關閉未關閉的標籤或錯誤的順序所有的錯誤,例如:

[b] 
    [i] 
    [/b] 
[/i] 

最簡單的方法:

  1. 準備標籤列表([b], [i] etc
  2. 搜索第一標籤並將其添加到堆棧
  3. 繼續觀察,如果有更多的開放標籤,則將它們推入堆棧。
  4. 當您找到結束標記時,請檢查堆棧頂部的內容。應該有正確的開標籤。如果不是,那麼你會發現你在找什麼。如果關閉標籤符合,那麼您可以彈出最後一個元素並繼續解析。
0

我寫了一個函數,告訴你在字符串內是否有一些未封閉的bb標籤。雖然它無法說明位置,但它告訴哪些標籤有錯誤,因此更容易找到它們。它還發現複雜的BB-標籤,如[URL =東西] URLNAME [/ URL]

<?PHP 
$test_string = " 
    [b]bold ok[/b] 
    [b]bold unclosed[b] 
    [i]italic unclsed[i] 
    [i]italic[/i] 
"; 

echo checkBBCode($test_string); 

//------------------------------------ 

function checkBBCode($str) 
{ 
    $result = ""; 

    $taglist = array("b", "i", "u", "h1", "h2", "url"); //the bb-tags to search for 
    $result_array = array(); 

    foreach($taglist as $tag) 
    { 
     // How often is the open tag? 
     preg_match_all ('/\['.$tag.'(=[^ ]+)?\]/i', $str, $matches); 
     $opentags = count($matches['0']); 

     // How often is the close tag? 
     preg_match_all ('/\[\/'.$tag.'\]/i', $str, $matches); 
     $closetags = count($matches['0']); 

     // how many tags have been unclosed? 
     $unclosed = $opentags - $closetags; 
     $unclosed = (int)$unclosed*-1; //force positive values 


     $result_array[] = $tag." :".$unclosed; 
    } 

    foreach($result_array as $check) 
    { 
     $result .= "\n\r<br>".$check; 
    } 
    return $result; 
} 


?> 

我發現dreamincode.net有不同的做法在前臺工作,並顯示不正確的標籤在視覺上突出顯示一個有用的腳本他們。

bb_check live demo

bb_check full article