現在の位置: ホーム> 最新記事一覧> PHPのMB_EREGI_REPLACE機能の代替として1ドルを使用する方法は、スキーマにグループ化しませんか?

PHPのMB_EREGI_REPLACE機能の代替として1ドルを使用する方法は、スキーマにグループ化しませんか?

M66 2025-06-16

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ドルを使用する場合は、正規表現に対応するキャプチャグループがあることを確認する必要があります。

ソリューション1:グループの正規表現

たとえば、モードを次のように変更します。

 $pattern = '(hello)';
$replacement = '$1 world';
$subject = 'hello';

echo mb_eregi_replace($pattern, $replacement, $subject);

出力の結果は次のとおりです。

 hello world

知らせ:

  • 括弧を使用して、参照するパーツを包み、キャプチャグループを示します。

  • 一致する文字列全体のみがキャプチャされていても、 $ 1を使用できます。


スキーム2: $ 0の一致する文字列全体を参照してください

一部の通常の交換機能では、 $ 0は一致する文字列全体を表します。残念ながら、 MB_EREGI_REPLACEは0ドルをサポートせず、グループでのみ1ドル2ドルなどを参照できます。


ソリューション3: $ 1を使用しないで、コールバックに置き換えます

パターンを変更してグループ化を追加するのが便利でない場合は、 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ドルは一致するコンテンツに置き換えられませんが、通常の文字列として扱われます。

  • グループを追加したくない場合、またはグループを追加できない場合は、コールバック関数を使用して複雑な交換を実装することをお勧めします。


参照リンク