在构建开发工具、博客引擎或代码分享平台时,语法高亮是一个重要的功能。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)。