早期論壇常需將使用者輸入的類 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() 主函式html_trans() 將 <>& 等轉為實體,防 XSS。while($loop-- > 0) 反覆套用 htc2html_loop(),直到無標籤或達上限(預設 3 輪),解決巢狀問題。link_url() 偵測純文字 URL/Email 轉超連結。highlight_string() 內建函式function php_highlight($str) {
return highlight_string(str_replace('\\"', '"', $str), true);
}
function css_highlight($str) {
// 選擇器→紅、屬性名→綠、屬性值→藍
preg_match_all("/[\\*\\.\\w#: ]+\\{[^\\{\\}]+\\}/", $str, $m);
// ... 逐規則重組帶 的 HTML
}
$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 替換
<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);
?>
html_trans(),且 exec: 回呼函式內部需再次過濾。