在構建開發工具、博客引擎或代碼分享平台時,語法高亮是一個重要的功能。 PHP 本身雖然不像前端那樣有現成的高亮庫(如Prism.js 或Highlight.js),但我們可以用純PHP 實現基礎的語法高亮。而preg_replace_callback_array()函數提供了一種簡潔優雅的方式來匹配不同的代碼元素並用不同顏色或標籤包裹它們。
本文將介紹如何使用preg_replace_callback_array()來實現一個簡單的PHP 語法高亮器。
preg_replace_callback_array()是PHP 7.0 引入的一個函數,它允許你一次性對多個正則表達式分別指定不同的回調函數。這相比老方法preg_replace_callback()需要為每個規則調用一次,結構更清晰、效率也更高。
基本語法如下:
preg_replace_callback_array(array $patterns_and_callbacks, string $subject);
我們想要高亮以下元素:
PHP 關鍵字(如function , echo , if等)
字符串(單雙引號包圍的內容)
註釋( //開頭或/* ... */ )
變量(以$開頭的標識符)
<?php
$code = <<<'PHP'
<?php
// 這是註釋
function sayHello($name) {
echo "Hello, $name!";
}
PHP;
function highlight_php_code(string $code): string {
$keywords = ['function', 'echo', 'if', 'else', 'return'];
$keywordPattern = '/\b(' . implode('|', $keywords) . ')\b/';
$stringPattern = '/([\'"])(.*?)(\1)/s';
$commentPattern = '/(\/\/.*?$|\/\*.*?\*\/)/ms';
$variablePattern = '/(\$\w+)/';
$patterns = [
$keywordPattern => function ($matches) {
return '<span style="color: blue; font-weight: bold;">' . $matches[0] . '</span>';
},
$stringPattern => function ($matches) {
return '<span style="color: green;">' . htmlspecialchars($matches[0]) . '</span>';
},
$commentPattern => function ($matches) {
return '<span style="color: gray; font-style: italic;">' . htmlspecialchars($matches[0]) . '</span>';
},
$variablePattern => function ($matches) {
return '<span style="color: darkorange;">' . $matches[0] . '</span>';
},
];
// 安全處理 HTML
$code = htmlspecialchars($code);
// 先處理 PHP 標籤
$code = preg_replace('/<\?php/', '<span style="color: purple;"><?php</span>', $code);
// 應用語法高亮
return nl2br(preg_replace_callback_array($patterns, $code));
}
// 輸出高亮後的 HTML 代碼
echo highlight_php_code($code);
?>
這段代碼執行後,會輸出一個HTML 格式的字符串,包含帶樣式的PHP 代碼:
關鍵字變成藍色加粗
字符串變成綠色
註釋是灰色斜體
變量是深橘色
你可以把它直接嵌入到你的頁面中,如:
<pre style="background-color: #f9f9f9; padding: 10px;">
<?php echo highlight_php_code($code); ?>
</pre>
如果你開發的是一個代碼分享平台,比如:
https://m66.net/snippet/123
就可以在查看代碼詳情頁中,使用這個函數對用戶的PHP 代碼片段進行高亮,提升可讀性。
使用preg_replace_callback_array()實現PHP 語法高亮,不僅邏輯清晰,而且性能不錯,適合輕量級代碼顯示需求。當然,如果你需要更高級的語法分析功能,考慮結合PHP 的tokenizer 擴展或使用第三方庫(如highlight.php)。