文字列置換を扱うとき、PHPはいくつかの強力なツールを提供します。その中には、 preg_replace_callbackは、通常の式を使用して一致する結果をコールバックできる広く使用されている機能です。ただし、PHP 7以降、より強力な機能が導入されています。PREG_REPLACE_CALLBACK_ARRAYは、同様のタスクを実行するだけでなく、柔軟性と読みやすさをもたらします。
この記事では、これらの2つの機能がどのように使用されるか、および例を比較することでそれぞれの利点を詳細に説明し、 Preg_replace_callback_arrayがマルチパターンマッチングを扱う際に、よりエレガントな選択である理由を探ります。
preg_replace_callbackは、通常のパターン配列とコールバック関数を受信し、同じコールバックを使用してすべての一致を処理します。
例:
$pattern = ['/foo/', '/bar/'];
$callback = function ($matches) {
return strtoupper($matches[0]);
};
$text = "foo and bar";
$result = preg_replace_callback($pattern, $callback, $text);
// 結果: "FOO and BAR"
問題は、異なるモードが同じコールバック関数を使用してロジックを処理し、複雑な一致の場合、コードが肥大化して不明確になることです。
preg_replace_callback_arrayを使用すると、異なる通常のモードに対して異なるコールバック関数を指定することで、柔軟性と読みやすさが向上します。
preg_replace_callback_array(array $patterns_and_callbacks, string $subject)
例:
$text = "Visit http://m66.net or send mail to info@m66.net";
$result = preg_replace_callback_array([
// 交換するURL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// 交換するEmail
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
], $text);
// 結果: 'Visit <a href="http://m66.net">http://m66.net</a> or send mail to <a href="mailto:info@m66.net">info@m66.net</a>'
各パターンの明確なコールバック関数を指定することにより、コードロジックがより明確になる可能性があり、同じ関数でif/elseを使用して一致するパターンを決定する必要がなくなります。
HTMLにリンクするための1つは、互いに干渉しない敏感な単語置換のために、一致するパターンごとに完全に異なる処理ロジックを提供できます。
各パターンは対応するコールバックに結合しているため、複数のパターンが関数を共有するときに発生する可能性のある論理的な混乱または誤った誤解を回避します。
preg_replace_callback_arrayは、配列の順序で交換操作を実行します。つまり、優先順位を制御できます。他のモードの前に交換操作を実行します。
$text = "訪問してください http://m66.net,または連絡します admin@m66.net,または @john もっと詳しく知る。";
$result = preg_replace_callback_array([
// URL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// Email
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
// @ユーザー
'/@(\w+)/' => function ($matches) {
return '<a href="http://m66.net/user/' . $matches[1] . '">@' . $matches[1] . '</a>';
},
], $text);
結果は、フォーラム、コメント領域、チャットシステムなどに適した豊富なテキスト出力になります。
preg_replace_callback_arrayはPHP 7.0で導入され、古いバージョン(PHP 5.6など)で実行すると使用できません。
PHPの古いバージョンのサポートを維持したい場合は、従来のpreg_replace_callbackのみを使用できます。
preg_replace_callback_arrayは、特に複数のモードが異なる処理ロジックを必要とする場合、よりエレガントな通常の交換ソリューションをもたらします。プロジェクトが既にPHP 7.0以降で実行されている場合、 PREG_REPLACE_CALLBACKに基づいて元のマルチモード処理ロジックを移行することを強くお勧めします。
将来のPHP開発は、もはや「それを使用するだけ」だけではありませんが、エレガントに、明確で、メンテナンスが簡単である必要があります。