是的,phpBB 的 BBCode 系統是 **自己寫的(內建的一套 parser)**,而且整個專案是 GPL 開源的,你可以直接在原始碼裡找到 BBCode parser 的實作。
下面直接教你怎麼找。
---
## 1. phpBB 的 BBCode 是自己寫的嗎?
* phpBB 本身是一套完整的論壇系統,BBCode 是它的核心功能之一。
* 官網與 Wikipedia 都提到:BBCode 原本就是 phpBB/UBB 系論壇所創出來的標記語法,後來變成業界實際標準。([Wikipedia][1])
* phpBB 並沒有使用 PECL 的 bbcode 擴展,而是 **在 PHP 裡自帶一套 BBCode 系統與 parser**,包括自訂 BBCode、轉成 HTML、儲存時加上 `bbcode_uid` 等機制。([phpbb.com][2])
所以答案:**是,phpBB 使用的是自己實作的 BBCode parser,且隨 phpBB 原始碼一起發佈。**
---
## 2. 原始碼是開源的嗎?在哪裡看?
是開源的,GPL 授權:
* 官方 GitHub:`github.com/phpbb/phpbb` ([Wikipedia][1])
你可以直接:
1. 打開 phpBB 的 GitHub repo
2. 切到目前穩定分支(例如 `3.3.x` 或 `3.2.x` 等)
3. 往 `phpbb/` 這個資料夾底下找「text formatter / bbcode」相關檔案(下面幫你列路徑)。
---
## 3. 怎麼在程式碼裡找到「BBCode parser 的部分」?
### 3.1 老版本(phpBB 3.0 以前)的傳統 parser
在 phpBB 3.0 時代及之前,BBCode parser 比較直覺,主要集中在這些檔案中(你若下載 3.0.x 的原始碼就能看到):
* `includes/bbcode.php`
* 這裡面有一個 `bbcode` 類別,處理標準 BBCode tag([ b]、[ i]、[ url]…)轉成 HTML。
* `includes/message_parser.php`
* 對貼文內容做預處理、加 `bbcode_uid`、呼叫 `bbcode` 類別進行 parse 等。
在論壇討論裡也有人稱其為「legacy bbcode parser」,並說明為了 PHP 7 之後改寫。([phpbb.com][3])
### 3.2 新版本(phpBB 3.1/3.2/3.3 之後)的 parser
從 phpBB 3.1 開始,官方把 BBCode 系統「完全重寫」過一次:([Wikipedia][1])
* 改為基於 text formatter 的架構(使用 s9e TextFormatter 作為底層 library,再加 phpBB 自己的設定與擴充)。
* 所以你會在原始碼看到跟「textformatter / textformatter_s9e / bbcode」有關的一整套東西。
在 GitHub 上大概是下面這些路徑(實際可能隨版本微調):
* `phpbb/textformatter/s9e/parser.php` / `renderer.php`
* `phpbb/textformatter/s9e/factory.php`
* `phpbb/textformatter/s9e/…`
* 部分 BBCode 設定則儲存在資料表中(`phpbb_bbcodes`),由 ACP(管理後台)管理。
這一套把:
1. 使用者輸入含 BBCode 的文字
2. 呼叫 phpBB 的 text formatter(包了一層 s9e TextFormatter)
3. 解析 BBCode → 產生內部結構 → 再輸出 HTML
整個流程都整合在一起。官方開發論壇 & 手冊裡有多次提到這個「新的 BBCode 系統」。([phpbb.com][3])
---
## 4. 實際「怎麼找 parser」的幾個簡單方法
假設你已經把 phpBB 原始碼下載到本地(或在 GitHub 線上看):
### 方法 A:搜關鍵字
1. 搜尋字串 `class bbcode`
* 在老版本(3.0.x)的 `includes/bbcode.php` 裡一定會找到。
2. 搜尋 `bbcode_uid`
* 幾乎所有跟 BBCode parse / 儲存相關的流程都會觸及這個欄位,在 `includes/message_parser.php` 等檔案裡能看到怎麼呼叫 parser。
### 方法 B:走「渲染貼文」的流程
1. 找輸出貼文 HTML 的地方(例如 `viewtopic.php` 所 include 的檔案)。
2. 往上追蹤函數呼叫,通常會看到類似 `generate_text_for_display()` 或類似名字的工具函數,它們會把儲存於 DB 的內容送到 text formatter / bbcode parser。
3. 往這些函數的定義走,就會碰到 text formatter / s9e 的 wrapper 類別。
### 方法 C:看 ACP 自訂 BBCode 的程式
管理後台裡有「自訂 BBCode」功能:
* 對應的 PHP 檔在哪裡(通常在 `includes/acp/` 之類的路徑)
* 裡面會讀寫 `phpbb_bbcodes` 資料表並於存取時呼叫 text formatter interface,這些 code 通常能帶你走到核心 parser 的類。
論壇上討論「新舊 BBCode parser」的帖子,也會順便提及相關檔案名與類名。([phpbb.com][3])
---
## 5. 如果你只是想「理解 phpBB 的 BBCode 做法」
可以這樣看:
1. **歷史層面**:
* phpBB 很早就發明並推廣 BBCode,本身也一直內建 parser。([Wikipedia][4])
2. **技術層面**:
* 老版本:自家的 `bbcode` 類 + `preg_replace` 等實作。
* 新版本:轉用 s9e TextFormatter 的 library,再加一層 phpBB 自己的 API/設定/儲存模式。([phpbb.com][3])
如果你有指定版本(例如「請幫我看 3.0.14 的 bbcode.php 怎麼運作」或「3.3 的 s9e text formatter 接口怎麼呼叫」),我也可以照那個版本一步步拆給你看,順便畫流程(輸入 BBCode → parser → DOM → HTML)。
[1]:
https://en.wikipedia.org/wiki/PhpBB?utm ... hatgpt.com "PhpBB"
[2]:
https://www.phpbb.com/community/viewtop ... hatgpt.com "Best way for bbcode content parsing"
[3]:
https://www.phpbb.com/community/viewtop ... hatgpt.com "Legacy BBcode Parser"
[4]:
https://es.wikipedia.org/wiki/BBCode?ut ... hatgpt.com "BBCode"