首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP BBCode 解析器實作:支援巢狀標籤、程式碼高亮與多媒體嵌入

     編輯:PHP 綜合知識

專案背景

早期論壇常需將使用者輸入的類 BBCode 標記(如 [b]粗體[/b]、[code]程式碼[/code])轉換為 HTML。本文整理一套支援多層巢狀、同標籤巢狀、程式碼高亮(PHP/CSS/HTML/JS)、多媒體嵌入(圖片、Flash、音樂、影片)的 PHP 4/5 相容解析器,適合整合至留言板、部落格、CMS 系統。

核心資料結構:三類標籤對應表

<?php
// 1. 無參數標籤:[TAG]內容[/TAG]
$htc_list = array(
    "B"       => "<b>\\1</b>",
    "I"       => "<i>\\1</i>",
    "URL"     => "<a href='\\1'>\\1</a>",
    "IMAGE"   => "<img src='\\1' ... />",
    "QUOTE"   => "<div class='quote'>\\1</div>",
    // ... 更多
);

// 2. 有參數標籤:[TAG=參數]內容[/TAG]
$htc_list_att = array(
    "URL"      => "<a href='\\1'>\\2</a>",
    "IMAGE"    => "<img alt='\\1' src='\\2' ... />",
    "FONTCOLOR"=> "<span style='color:\\1'>\\2</span>",
    // ...
);

// 3. 特殊處理標籤:需呼叫自訂函式
$htc_list_spl = array(
    "PHP"      => "exec:get_highlight_html('\\1', 'php')",
    "CSS"      => "exec:get_highlight_html('\\1', 'css')",
    "CODE"     => "exec:get_code_html('\\1')",
    // ...
);
?>

解析流程:htc2html() 主函式

  1. 預處理:移除標籤前後空白、先行提取特殊標籤內容佔位,避免巢狀干擾。
  2. HTML 轉義:html_trans() 將 <>& 等轉為實體,防 XSS。
  3. 迴圈替換:while($loop-- > 0) 反覆套用 htc2html_loop(),直到無標籤或達上限(預設 3 輪),解決巢狀問題。
  4. 自動連結:link_url() 偵測純文字 URL/Email 轉超連結。
  5. 還原特殊標籤:將佔位符替換為高亮/多媒體 HTML。

程式碼高亮實作亮點

PHP:highlight_string() 內建函式

function php_highlight($str) {
    return highlight_string(str_replace('\\"', '"', $str), true);
}

CSS:自訂正則分離選擇器、屬性、值並著色

function css_highlight($str) {
    // 選擇器→紅、屬性名→綠、屬性值→藍
    preg_match_all("/[\\*\\.\\w#: ]+\\{[^\\{\\}]+\\}/", $str, $m);
    // ... 逐規則重組帶  的 HTML
}

JavaScript:關鍵字、物件、函式分色

$keywords = array(
    "red"   => array("null","true","false"),
    "blue"  => array("var","for","if","function","window","document"),
    "brown" => array("Math","Array","String"),
    "green" => array("function names via regex"),
);
// 逐類別 preg_replace 替換

HTML/JS 混合:先抽離 <script>、<style> 區塊分別高亮,再合併

多媒體與互動標籤範例

標籤輸出內容
[FLASH]swf_url[/FLASH]<object classid="clsid:D27CDB6E...">...</object>
[VOTE]poll_id[/VOTE]動態從資料庫讀取投票選項、統計圖並產生表單
[DOWNLOAD=說明]檔案路徑[/DOWNLOAD]自動判斷副檔名顯示圖示、產生下載連結

使用方式

<?php
require_once "htc.parser.php";
$input = "[QUOTE][PHP]echo 'hello';[/PHP][/QUOTE]";
echo htc2html($input);
?>

安全性與維護提醒

  • XSS 風險:輸出前務必 html_trans(),且 exec: 回呼函式內部需再次過濾。
  • 效能:大量正則替換較慢;高流量建議改用狀態機解析器或編譯為 PHP Opcode 快取。
  • 擴充性:新增標籤只需在三個陣列加入對應規則,符合開放封閉原則。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved