BBCode的高級用法探秘

分享讨论IT相关的内容
回复
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4152
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 164 次
被圈友点赞: 194 次
联系:

BBCode的高級用法探秘

帖子 ejsoon »

phpbb的bbcode的高級用法,在網上幾乎是找不到任何介紹和討論的。如果你想學,只能找官方提供的bbcode示例了。

首先是最常用的「?」,當不必填時就加到後面。這是個非常必要的功能,但是phpbb從來不講。
來自:https://www.phpbb.com/customise/db/bbcode/audio_tag/

代码: 全选

[audio={TEXT?}]{URL}[/audio]



再就是defaultValue,默認值,也是一個非常必要的功能。也不知道為何phpbb不介紹。
來自:https://www.phpbb.com/customise/db/bbco ... poiler_js/

代码: 全选

[spoiler={INTTEXT;defaultValue=Spoiler}]{TEXT}[/spoiler]



下面這個功能就沒那麼必要,不過它倒是複雜到了我有點看不懂的程度。寫這個的恐怕是Phpbb的作者吧?如果不是,難道你看了phpbb的相關代碼?
來自:https://www.phpbb.com/customise/db/bbco ... le_anchor/

代码: 全选

[anchor={IDENTIFIER;useContent}]{TEXT;optional}[/anchor]

代码: 全选

<xsl:if test="@anchor"><xsl:apply-templates/></xsl:if> <xsl:if test="@content!=''"></xsl:if><a class="postlink visible-anchor" id="{@anchor}" title="{@anchor}" href="#{@anchor}">#</a>



不過後來我聽說,BBCode解析器是php的一個官方擴展,並不是phpbb獨有的,所以可能要學會它的用法,還要去找php官方(而不是phpbb官方)。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4152
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 164 次
被圈友点赞: 194 次
联系:

Re: BBCode的高級用法探秘

帖子 ejsoon »

https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4152
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 164 次
被圈友点赞: 194 次
联系:

Re: BBCode的高級用法探秘

帖子 ejsoon »

以下是chatgpt對phpbb的bbcode的介紹:
是的,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"
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
圈宝
圈圈守护者
圈圈守护者
帖子: 126
注册时间: 2020年 12月 4日 20:46
我的状态: 🎯
为圈友点赞: 111 次
被圈友点赞: 19 次

Re: BBCode的高級用法探秘

帖子 圈宝 »

ejsoon 写了: 2025年 12月 1日 13:59 再就是defaultValue,默認值,也是一個非常必要的功能
这种形式的bbcode,论坛已经有在用上的。比如paper bbcode。
当时明月在,曾照彩云归
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客