文字列置換を扱う場合、PHPのpreg_replace_callback()関数は、コールバック関数を介して一致する結果を柔軟に処理できます。ただし、複数の異なる正規表現がある場合、それぞれを異なるロジックで処理する必要があります。PREG_REPLACE_CALLBACK_ARRAY ()が理想的な選択です。
PHP 7以降、 preg_replace_callback_array()は、複数の通常のパターンとそれらの対応するコールバック関数を連想配列の形で定義するエレガントな方法を提供します。
この記事では、その使用法を説明し、複数のマッチングロジックを同時に例と同時に処理する方法を示します。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null): string|array|null
$ patterns_and_callbacksは連想配列であり、キーは正規表現であり、値は対応するコールバック関数です。
$件名は、処理される文字列です。
テキストのリンクとメールアドレスを識別し、リンクを<a>タグに包み、メールアドレスにmailtoを追加するとします。
$text = <<<EOT
当社のウェブサイトへようこそ http://m66.net/page,メールを送信することもできます support@m66.net 相談してください。
EOT;
$result = preg_replace_callback_array([
// 対処する URL
'/\bhttps?:\/\/[^\s]+/i' => function ($matches) {
$url = htmlspecialchars($matches[0]);
return "<a href=\"{$url}\">{$url}</a>";
},
// 対処する邮箱地址
'/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i' => function ($matches) {
$email = htmlspecialchars($matches[0]);
return "<a href=\"mailto:{$email}\">{$email}</a>";
}
], $text);
echo $result;
当社のウェブサイトへようこそ <a href="http://m66.net/page">http://m66.net/page</a>,メールを送信することもできます <a href="mailto:support@m66.net">support@m66.net</a> 相談してください。
preg_replace_callback_array()は、特に処理に適しています。
Markdown、BBCode、Custom Syntaxなどのさまざまなテキスト分析。
複数の形式の識別と交換。
複雑なテキストで異なる構造を処理するときは、読みやすさとメンテナンスを改善します。
正規表現の順序は重要であり、以前のルールが最初に実行されます。
htmlspecialchars()を使用して、XSS攻撃を回避します(特にユーザー入力の処理の場合)。
PHPのPCREライブラリは、より高いバージョンでより強力であり、PHP 7.1+を使用することをお勧めします。
preg_replace_callback_array()を使用して、複数の通常のパターンと対応する処理方法を簡単に定義できます。これは、テキスト処理における強力で過小評価されているツールです。
マスターすると、コードがよりエレガントになるだけでなく、開発効率を大幅に向上させます。