PHPでは、 MB_EREGI_REPLACE関数は、症例感受性の正規表現置換をサポートするマルチバイトセーフの通常の交換関数です。その使用法はEREGI_REPLACEに似ていますが、マルチバイト文字列に最適化されています。
交換にMB_EREGI_REPLACEを使用する場合、次のような最初のキャプチャグループのコンテンツを参照するために、交換用文字列に1ドルを使用することが一般的です。
$pattern = 'pattern';
$replacement = '$1 something';
mb_eregi_replace($pattern, $replacement, $subject);
ただし、正規表現パターンでグループ化が定義されていない場合(つまり、括弧内にサブパターンが囲まれているサブパターンはありません)、 1ドルには対応するコンテンツがなく、 1ドルは通常の文字列と見なされ、一致するコンテンツに置き換えられません。
これにより、交換結果が予想されるものではない場合があります。
1ドルや2ドルなどの特別なシンボルは、正規表現でキャプチャグループの内容を参照するために使用されます。正規表現が括弧でグループ化されていない場合、これらの参照は無効です。
例えば:
$pattern = 'hello';
$replacement = '$1 world';
$subject = 'hello';
// グループ化はありません,$1 対応するコンテンツはありません
echo mb_eregi_replace($pattern, $replacement, $subject);
このコードの結果は次のとおりです。
$1 world
想像の代わりに:
hello world
代替結果で1ドルを使用する場合は、正規表現に対応するキャプチャグループがあることを確認する必要があります。
たとえば、モードを次のように変更します。
$pattern = '(hello)';
$replacement = '$1 world';
$subject = 'hello';
echo mb_eregi_replace($pattern, $replacement, $subject);
出力の結果は次のとおりです。
hello world
知らせ:
括弧を使用して、参照するパーツを包み、キャプチャグループを示します。
一致する文字列全体のみがキャプチャされていても、 $ 1を使用できます。
一部の通常の交換機能では、 $ 0は一致する文字列全体を表します。残念ながら、 MB_EREGI_REPLACEは0ドルをサポートせず、グループでのみ1ドル、 2ドルなどを参照できます。
パターンを変更してグループ化を追加するのが便利でない場合は、 MB_EREG_REPLACE_CALLBACKなどの代わりにコールバック関数をサポートする交換機能を使用し、コールバックで一致するロジックを処理できます。
例:
$pattern = 'hello';
$subject = 'hello';
$result = mb_ereg_replace_callback($pattern, function ($matches) {
// $matches[0] それはすべての試合です
return $matches[0] . ' world';
}, $subject);
echo $result;
出力:
hello world
MB_EREGI_REPLACEは1ドルと2ドルを使用してグループ化コンテンツを参照しており、対応するキャプチャグループが正規表現に存在することを確認する必要があります。
グループ化がない場合、 1ドルは一致するコンテンツに置き換えられませんが、通常の文字列として扱われます。
グループを追加したくない場合、またはグループを追加できない場合は、コールバック関数を使用して複雑な交換を実装することをお勧めします。