preg_replace_callback_arrayは、PHPの関数であり、開発者が文字列内の複数の異なる正規表現を使用して操作を見つけて置き換えることができます。通常のpreg_replaceとは異なり、 preg_replace_callback_arrayを使用すると、各パターンのコールバック関数を指定できます。これにより、複雑な交換タスクの処理が柔軟で効率的になります。
関数定義は次のとおりです。
preg_replace_callback_array(array $patterns, string $subject): string
$パターン:キーが正規表現パターンであり、値がコールバック関数であるアレイ。
$件名:交換操作を実行する文字列。
最も基本的な使用法は、複数の通常のパターンと対応するコールバック関数を含む配列を定義し、 preg_replace_callback_arrayに渡すことです。たとえば、次のコードを使用して、文字列の数字と文字を特定の形式に変換できます。
$patterns = [
'/(\d+)/' => function($matches) {
return '<number>' . $matches[0] . '</number>';
},
'/([a-zA-Z]+)/' => function($matches) {
return '<text>' . strtoupper($matches[0]) . '</text>';
}
];
$subject = "Hello123 World456";
$result = preg_replace_callback_array($patterns, $subject);
echo $result; // 出力:<text>HELLO</text><number>123</number> <text>WORLD</text><number>456</number>
この例では、文字列の数字は<number> </number>タグに包まれ、文字は首都に変換され、 <text> </text>タグに包まれます。
preg_replace_callback_arrayは、複数の正規表現を処理する必要がある場合にうまく機能します。これにより、1つの操作で複数の異なるパターンを処理することができ、コードを大幅に簡素化できます。
たとえば、電話番号、電子メールアドレス、文字列のURLを処理する必要がある場合は、必要に応じて通常のパターンとコールバック機能を割り当てることができます。
$patterns = [
'/(\d{3}-\d{3}-\d{4})/' => function($matches) {
return '<phone>' . $matches[0] . '</phone>';
},
'/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/' => function($matches) {
return '<email>' . $matches[0] . '</email>';
},
'/https?:\/\/([a-zA-Z0-9.-]+)/' => function($matches) {
return '<url>' . $matches[0] . '</url>';
}
];
$subject = "Contact me at 123-456-7890 or [email protected]. Visit https://gitbox.net for more info.";
$result = preg_replace_callback_array($patterns, $subject);
echo $result;
// 出力:Contact me at <phone>123-456-7890</phone> or <email>[email protected]</email>. Visit <url>https://gitbox.net</url> for more info.
この例では、電話、メールアドレス、およびURLはすべて別々に処理され、タグで包まれています。このようにして、複数の通常の交換タスクを1つの関数呼び出しで完了し、コードをより簡潔にすることができます。
場合によっては、交換操作は単純な文字列の交換以上のものである場合がありますが、より複雑な論理処理を行う必要がある場合があります。コールバック関数を使用すると、交換時にさらにカスタム操作を導入できます。たとえば、テキストの日付形式を置き換えて、「yyyy-mm-dd」形式に変換するとします。
$patterns = [
'/(\d{2})\/(\d{2})\/(\d{4})/' => function($matches) {
return $matches[3] . '-' . $matches[1] . '-' . $matches[2]; // に変換します YYYY-MM-DD 形式
}
];
$subject = "The event is on 12/07/2023.";
$result = preg_replace_callback_array($patterns, $subject);
echo $result; // 出力:The event is on 2023-12-07.
この例では、通常のマッチング日付形式を使用してから、コールバック関数の一致日を再フォーマットします。
通常の交換でURLを処理する必要があり、すべてのURLのドメイン名を特定のドメイン名( gitbox.netなど)に置き換える必要がある場合は、コードに従うことでこれを行うことができます。
$patterns = [
'/https?:\/\/([a-zA-Z0-9.-]+)/' => function($matches) {
return 'https://gitbox.net'; // すべてのドメイン名を置き換えます gitbox.net
}
];
$subject = "Check out my website at https://www.example.com or visit https://subdomain.example.com.";
$result = preg_replace_callback_array($patterns, $subject);
echo $result;
// 出力:Check out my website at https://gitbox.net or visit https://gitbox.net.
この例では、すべてのURLのドメイン部分はgitbox.netに置き換えられますが、パスと他の部分は変更されません。
preg_replace_callback_arrayは、複数の交換用タスクを処理する際に非常に効率的ですが、次の点に注意すべきパフォーマンスの問題がまだあります。
正規表現の過剰使用を避ける:単純な正規表現を使用してみてください。複雑なパターンはパフォーマンスの劣化につながる可能性があります。
コールバック関数の複雑さを最小限に抑える:コールバック関数の複雑なロジックは、全体的なパフォーマンスに影響を与えるため、コールバック関数を可能な限り簡潔に保ちます。