PHPでは、 PREG_REPLACE_CALLBACK_ARRAY関数は通常、通常の交換を実行するときにコールバック操作を実行するために使用されます。この関数は、キーが正規表現であり、値がマッチングを処理するコールバック関数である配列を受け入れます。ただし、場合によっては、特定のグループをキャプチャして$マッチに表示されないようにするため、不必要なオーバーヘッドまたは複雑な処理が行われます。
不要な$を受信しないように、 preg_replace_callback_arrayのコールバック関数のコンテンツと一致するために、キャプチャ以外のグループ化を使用できます。非キャプチャグループ化により、一部のグループが一致するときにキャプチャされないことを保証し、それにより、コールバック関数の不必要なマッチング結果を減らします。
非キャプチャグループは、括弧内に括弧を付けて正規表現で宣言されますか?: 。たとえば、 (?:...)は非キャプチャグループです。この場合、正規表現のグループは$マッチアレイにキャプチャされるのではなく、マッチパターンをグループ化するために使用されるコンポーネントのみです。
内部の複数のグループを持つ正規表現があると仮定しますが、他のグループの内容ではなく、一部のグループの一致するコンテンツのみを気にしているとします。次に、非キャプチャグループを使用して、正規表現を最適化できます。
<?php
// 例:にテキストを交換しますURL
$pattern = '/(?:https?:\/\/)(m66.net\/[a-z0-9\/\?=&]*)/i';
$replacement = function ($matches) {
// ただ気をつけてくださいURLのパス部分,全体を必要としませんURLおよび契約セクション
return 'https://m66.net' . $matches[1];
};
$input = '訪問してください https://m66.net/abc/def?query=xyz または http://m66.net/12345';
$output = preg_replace_callback_array([
$pattern => $replacement,
], $input);
echo $output;
?>
正規表現:
(?:https?:\/\/) :この部分は、URLのプロトコル部分(httpまたはhttps)と一致する非キャプチャグループです。この部分は必要ないので、キャプチャ以外のグループ化を使用します。
(m66.net \/[a-z0-9 \/\?=&]*) :これはキャプチャグループであり、 M66.netの背後にあるパス部分( /abc/def?query = xyzなど)です。
コールバック関数:
コールバック関数では、プロトコルパーツ( https://またはhttp:// )を無視して、 $マッチ[1]を介してURLのパス部分を取得します。
プロトコルの部分はキャプチャされていないため、 preg_replace_callback_arrayは、コールバック関数の置換値として$ Matches [1]のみを提供します。
出力結果:
元のテキストのURLは、私たちが気にする形式に正しく置き換えられており、不要な$のコンテンツはありません。
非キャプチャグループ(?:...)を使用すると、コールバック関数で不要なマッチンググループの受信を避けるのに役立ちます。これにより、不必要なリソースの消費が減少するだけでなく、特に複雑な正規表現を扱う場合、コードをより簡潔で理解しやすくするため、注意が必要な一致する結果を効果的に減らすことができます。