UBB (Universal Bulletin Board) 代碼是論壇常用的輕量標記語言。本文實作一個 Day::ubb() 方法,使用正則表達式將常見 UBB 標籤轉換為 HTML。注意:ereg_replace 已棄用移除,現代寫法全面改用 preg_replace。
<?php
class UBBParser {
public static function parse(string $text): string {
// 1. 基礎處理
$text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); // 先跳脫 HTML
$text = nl2br($text); // 換行轉
// 2. 標籤轉換規則(順序重要:巢狀/複雜標籤優先)
$patterns = [
// [url] 與 [url=...]
'/\[url\](https?:\/\/[^\]]+)\[\/url\]/i' => '$1',
'/\[url\]([^\]]+)\[\/url\]/i' => '$1',
'/\[url=(https?:\/\/[^\]]+)\]([^\]]+)\[\/url\]/i' => '$2',
'/\[url=([^\]]+)\]([^\]]+)\[\/url\]/i' => '$2',
// [color=...] [font=...]
'/\[color=([^\]]+)\]([^\]]+)\[\/color\]/i' => '$2',
'/\[font=([^\]]+)\]([^\]]+)\[\/font\]/i' => '$2',
// [email] [email=...]
'/\[email\]([^\]]+)\[\/email\]/i' => '$1',
'/\[email=([^\]]+)\]([^\]]+)\[\/email\]/i' => '$2',
// 文字樣式
'/\[b\]([^\]]+)\[\/b\]/i' => '$1',
'/\[i\]([^\]]+)\[\/i\]/i' => '$1',
'/\[u\]([^\]]+)\[\/u\]/i' => '$1',
// 特效(不建議現代網站使用,保留相容性)
'/\[fly\]([^\]]+)\[\/fly\]/i' => '$1',
'/\[move\]([^\]]+)\[\/move\]/i' => '$1',
// [shadow=color,direction,strength] 簡化為 CSS
'/\[shadow=([#\w]+),(\d+),(\d+)\]([^\]]+)\[\/shadow\]/i'
=> '$4',
];
foreach ($patterns as $pattern => $replacement) {
$text = preg_replace($pattern, $replacement, $text);
}
return $text;
}
}
// 使用範例
$input = "歡迎使用 [b]UBB[/b] 代碼!訪問 [url=https://example.com]範例網站[/url]。";
echo UBBParser::parse($input);
?>
<font>、<marquee> 改用 <span style="...">。htmlspecialchars,否則惡意使用者可注入 `