PHP開発では、文字列交換は非常に一般的な操作です。さまざまなマーカーのセットに従ってさまざまな方法でテキストを交換する必要がある場合、 preg_replace_callback_arrayは特に便利です。
この記事では、 preg_replace_callback_arrayを使用して「マーク駆動型の」データインジェクションメカニズムを実装する方法を示し、データをテンプレート文字列に柔軟に埋め込むことができます。
preg_replace_callback_arrayは、PHP 7で導入された関数です。これにより、一連の正規表現と対応するコールバック関数を介して文字列を置き換えることができます。
その署名は次のとおりです。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null): string
たとえば、複数の異なるタイプのタグを含むテキストの段落がある状況を想像してください。
訪問してください[[url:/welcome]],現在の時刻はです{{time}}。
[[url:/welcome]]をハイパーリンクに、 {{time}}に現在の時刻に置き換えたいと思います。
タグに一致するために2つの正規表現を使用します。
\ [\ [url:(。*?)\] \]は、 URLタイプのタグを一致させるために使用されます。
\ {\ {time \} \}は、タイムスタンプを一致させるために使用されます。
$template = '訪問してください[[url:/welcome]],現在の時刻はです{{time}}。';
$patterns = [
'/\[\[url:(.*?)\]\]/' => function ($matches) {
$path = $matches[1];
return '<a href="https://m66.net' . htmlspecialchars($path) . '">ここをクリック</a>';
},
'/\{\{time\}\}/' => function () {
return date('Y-m-d H:i:s');
},
];
$output = preg_replace_callback_array($patterns, $template);
echo $output;
訪問してください<a href="https://m66.net/welcome">ここをクリック</a>,現在の時刻はです2025-04-21 14:30:00。
注:実際の時間は、実行時によって異なります。
このアプローチには、従来の複数のpreg_replace_callbackまたは文字列交換よりもいくつかの利点があります。
クリア構造:すべてのパターンと交換ロジックは、1つの配列に集中しており、メンテナンスが簡単です。
より効率的な実行:すべてのモードは、テキストの複数のスキャンなしで一度に処理できます。
強力なスケーラビリティ:新しいタグを追加するには、アレイにアイテムを追加する必要があり、他のコードを変更する必要はほとんどありません。
ユーザー名、乱数など、よりダイナミックタグをサポートしたい場合は、 $パターンアレイの展開を続けてください。
$patterns['/\{\{user\}\}/'] = function () {
return 'シャオミン';
};
$patterns['/\{\{rand\}\}/'] = function () {
return rand(1, 100);
};
次に、次のようなテンプレートで使用します。
いらっしゃいませ,{{user}}!あなたの幸運な番号はです:{{rand}}。
タグ駆動型のデータインジェクションエンジンは、 preg_replace_callback_arrayを使用して簡単に実装できます。セマンティックであるだけでなく、非常に拡張可能であり、テンプレートシステム、コンテンツ処理、豊富なテキストエスケープ、その他のシナリオでの使用に非常に適しています。
この記事がこの機能を理解して使用するのに役立つことを願っています。軽量のテンプレートエンジンまたはコンテンツレンダリングツールを開発している場合は、このアプローチを検討して、コードの品質と柔軟性を向上させてください。