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

PHP 實現 UBB 代碼轉 HTML 完整解析器:支援粗體、引用、代碼、圖片、連結、郵箱

     編輯:PHP 相關知識

PHP 實現 UBB 代碼轉 HTML 完整解析器:支援粗體、引用、代碼、圖片、連結、郵箱

UBB(Universal Bulletin Board)代碼是論壇常用的輕量標記語言。本文提供一個功能完整的 ubb2html() 函數,涵蓋常見標籤轉換、自動 URL 識別、圖片自適應縮放、引用/代碼區塊樣式化。

支援標籤對照表

UBB 標籤HTML 輸出說明
[b]...[/b]<b>...</b>粗體
[i]...[/i]<i>...</i>斜體
[u]...[/u]<u>...</u>底線
[center]...[/center]<center>...</center>置中
[quote]...[/quote]藍字引用區塊表格引用回覆
[code]...[/code]灰底代碼區塊表格程式碼顯示
[images]url[/images]<img src="url" onload="auto-resize">圖片自適應
[url]url[/url]<a href="url" target="_blank">url</a>自動連結
[url=url]text[/url]<a href="url" target="_blank">text</a>自訂連結文字
[email]mail[/email]<a href="mailto:mail">mail</a>郵箱連結

核心函數實現

function ubb2html($content) {
    global $article; // 假設全域配置

    // 1. 自動識別 URL(可選)
    if ($article['isparseurl'] == "1") {
        $content = parseurl($content); // 需自行實現或引用
    }

    // 2. 基礎標籤替換(使用 eregi_replace 兼容大小寫,建議改用 preg_replace)
    $content = eregi_replace('\[b\]', '<b>', $content);
    $content = eregi_replace('\[/b\]', '</b>', $content);
    $content = eregi_replace('\[i\]', '<i>', $content);
    $content = eregi_replace('\[/i\]', '</i>', $content);
    $content = eregi_replace('\[u\]', '<u>', $content);
    $content = eregi_replace('\[/u\]', '</u>', $content);
    $content = eregi_replace('\[center\]', '<center>', $content);
    $content = eregi_replace('\[/center\]', '</center>', $content);

    // 3. 複雜區塊標籤(引用、代碼)
    $content = eregi_replace('\[quote\]', 
        '<table width="96%" border="0" cellspacing="3" cellpadding="0" style="word-break:break-all" align="center"><tr><td><b>引用:</b></td></tr><tr><td><hr width="100%" noshade></td></tr><tr><td class="content"><font color="#0000FF">', $content);
    $content = eregi_replace('\[/quote\]', '</font></td></tr><tr><td><hr width="100%" noshade></td></tr></table>', $content);

    $content = eregi_replace('\[code\]', 
        '<table width="96%" border="0" cellspacing="3" cellpadding="0" style="word-break:break-all" align="center"><tr><td><b>代碼:</b></td></tr><tr><td><hr width="100%" noshade></td></tr><tr><td class="code"><font color="#0000FF">', $content);
    $content = eregi_replace('\[/code\]', '</font></td></tr><tr><td><hr width="100%" noshade></td></tr></table>', $content);

    // 4. 圖片、連結、郵箱(使用正則捕獲組)
    $content = eregi_replace('\[images\]([^\[]*)\[/images\]', 
        '<a href="\\1" target="_blank"><img src="\\1" border=0 onload="if(this.width>screen.width-333)this.width=screen.width-333" title="點擊查看原圖"></a>', $content);
    $content = eregi_replace('\[url\]www\.([^\[]*)\[/url\]', '<a href="https://www.\\1" target="_blank">www.\\1</a>', $content);
    $content = eregi_replace('\[url\]([^\[]*)\[/url\]', '<a href="\\1" target="_blank">\\1</a>', $content);
    $content = eregi_replace('\[url=([^\[]*)\]([^\[]*)\[/url\]', '<a href="\\1" target="_blank">\\2</a>', $content);
    $content = eregi_replace('\[email\]([^\[]*)\[/email\]', '<a href="mailto:\\1">\\1</a>', $content);

    return $content;
}

現代化重構建議

  1. 全面改用 preg_replace_callback,避免 eregi_replace 棄用問題。
  2. 引入 HTMLPurifier 在轉換後清理 XSS 風險。
  3. 支援巢狀標籤解析(需狀態機或遞歸下降解析器)。
  4. 加入自訂標籤擴展機制(如 [video]、[spoiler])。
  5. 輸出 HTML5 語意標籤(<blockquote>、<pre><code>)。

此函數是早期 PHP 論壇系統的核心組件,理解其原理有助於掌握輕量標記語言解析的基本模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved