PHPでは、 preg_replace_callback_arrayは、複数の正規表現を処理し、一致したときに指定されたコールバック関数を実行できる非常に強力な関数です。通常、各正規表現のコールバック関数を指定する必要がありますが、ロジックの複雑さが増加すると、このアプローチによりコールバック関数が冗長であり、維持が容易ではなくなる可能性があります。このプロセスを簡素化するために、名前のキャプチャグループを使用して、 preg_replace_callback_arrayのコールバックロジックを簡素化し、コードをより明確かつ容易にすることができます。
正規表現では、名前付きグループ化は、一致する結果の名前が付けられた識別子であり、数値インデックスだけでなく、名前ごとに一致するコンテンツにアクセスできます。グループに名前を付けるための構文は次のとおりです。
(?<name>pattern)
ここで、名前はそのグループに与える名前であり、パターンは実際の正規表現パターンです。
preg_replace_callback_arrayでは、通常、複数のパターンと対応するコールバック関数を含む配列を渡します。複数の正規表現を処理する必要がある場合、各式のコールバック関数を記述する必要があることがよくあります。これにより、コードが冗長になります。名前のグループ化を使用することにより、一致する結果をより直感的に取得することができ、それによりコールバックロジックへの依存が減少します。
具体的な例を次に示します。
preg_replace_callback_arrayを介してクエリパラメーターの一部を置き換える必要があるURLのセットがあるとします。名前のグループ化を使用して、コールバック関数のロジックを簡素化できます。
<?php
// 正規表現とコールバック関数を含む配列を定義します
$patterns = [
'/(?<scheme>https?):\/\/(?<host>[a-zA-Z0-9.-]+)\/(?<path>[^?]+)\?(?<query>.*)/' => function ($matches) {
// 名前付きグループによるマッチング結果にアクセスします
$scheme = $matches['scheme'];
$host = $matches['host'];
$path = $matches['path'];
$query = $matches['query'];
// ここでは、クエリパラメーターを処理できます
$query = str_replace('example.com', 'm66.net', $query);
// 交換された文字列を返します
return $scheme . '://' . $host . '/' . $path . '?' . $query;
}
];
// 対処すべきこと URL リスト
$urls = [
'https://example.com/path/to/resource?param1=value1¶m2=value2',
'http://example.com/another/path?param1=value1',
];
// 使用 preg_replace_callback_array 交換します
$updatedUrls = preg_replace_callback_array($patterns, $urls);
// 交換後に結果を出力します
foreach ($updatedUrls as $url) {
echo $url . PHP_EOL;
}
?>
正規表現部分:
(?<scheme> https?) : HTTPまたはHTTPSを一致させ、スキームに名前を付けます。
(?<host> [a-za-z0-9 .-]+) :ホストのドメイン名と名前を一致させます。
(?<athor> [^?]+) :パス部分を一致させ、パスに名前を付けます。
(?<Query>。*) :クエリパラメーターパーツを一致させ、クエリに名前を付けます。
コールバック関数パーツ:コールバック関数では、アクセスプロセスを簡素化する一致のグループ化( $ matches ['scheme']など)の名前を付けて正規表現マッチの部分を取得します。また、クエリ文字列部品を処理し、domain name embly.comをM66.netに置き換えました。
preg_replace_callback_array :この関数は、一連の正規表現とコールバック関数を受け入れ、URLを1つずつ一致させ、対応するコールバック関数を実行します。