構文の強調表示は、開発ツール、ブログエンジン、またはコード共有プラットフォームを構築する際の重要な機能です。 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()と比較して、各ルールの呼び出しが1回必要です。
基本的な構文は次のとおりです。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject);
次の要素を強調表示します。
PHPキーワード(関数、エコー、 IFなど)
文字列(奇数と二重引用符に囲まれたコンテンツ)
コメント( // startまたは/ * ... * / )
変数( $で始まる識別子)
<?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のトークナイザー拡張を組み合わせるか、サードパーティライブラリ(highlight.phpなど)を使用することを検討してください。