在 CMS 或富文本編輯器中,常需將類似 BBCode 的自定義標籤(如 [link url="..."]文字[/link])轉換為標準 HTML 鏈接。本文展示如何使用 PHP 正則表達式配合回調函數安全、高效地完成替換。
<?php
$str = '你好嗎[link url="https://www.example.com"]示例鏈接[/link]再見';
/**
* 將 [link url="..."]文字[/link] 替換為 <a href="..." target="_blank" class="col-blue">文字</a>
*/
$pattern = '/\[link url="([^"]+)"\](.*?)\[\/link\]/i';
$str = preg_replace_callback($pattern, function ($matches) {
$url = htmlspecialchars($matches[1], ENT_QUOTES, 'UTF-8');
$text = htmlspecialchars($matches[2], ENT_QUOTES, 'UTF-8');
return "<a href=\"$url\" target=\"_blank\" class=\"col-blue\">$text</a>";
}, $str);
echo $str;
// 輸出: 你好嗎<a href="https://www.example.com" target="_blank" class="col-blue">示例鏈接</a>再見
?>
(.*?) 確保匹配最近的 [/link],避免跨標籤匹配。preg_replace + str_replace 更安全,避免重複替換或注入風險。[LINK] 寫法。若內容同時包含標準 <a> 標籤與自定義標籤,可分步處理:
<?php
$html = '<a href="https://baidu.com">百度</a> 和 [link url="https://google.com"]Google[/link]';
// 1. 先保護現有 <a> 標籤(可選,視業務而定)
// 2. 處理自定義標籤
$pattern = '/\[link url="([^"]+)"\](.*?)\[\/link\]/i';
$html = preg_replace_callback($pattern, function ($m) {
return '<a href="' . htmlspecialchars($m[1]) . '" target="_blank">' . htmlspecialchars($m[2]) . '</a>';
}, $html);
echo $html;
?>
Parsedown for Markdown)。https://、https://、mailto: 等安全協議,過濾 javascript: 等危險協議。