現在の位置: ホーム> 最新記事一覧> パターンで正しい通常の構文を使用していないため、無効な交換

パターンで正しい通常の構文を使用していないため、無効な交換

M66 2025-05-27

PHPでは、 MB_EREGI_REPLACE関数を使用して、ケース非感受性の多バイト正規表現置換操作を実行します。これは、マルチバイトエンコードされた文字列(UTF-8など)専用に設計されたMbString拡張の一部です。従来のeregi_replaceと比較して、 MB_EREGI_REPLACEは、中国語、日本、韓国語などのマルチバイトキャラクターを処理するのに適しています。

ただし、多くの開発者は、 MB_EREGI_REPLACEを使用する際に無効な交換の問題に遭遇します。根本的な原因は、正規表現パターンでは正しい通常の構文が使用されないことです。この記事では、非標準のパターンが、正規表現の構文から交換障害とMB_EREGI_REPLACEの使用の詳細を引き起こす可能性がある理由を説明します。


MB_EREGI_REPLACE関数の紹介

関数定義は次のとおりです。

 string mb_eregi_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )
  • $パターン:マッチング、ケース非感受性のための正規表現。

  • $の交換:交換された文字列。

  • $文字列:保留中の文字列。

  • $オプション:正規表現の修飾子は、デフォルトで「MSR」になります。

MbStringのマルチバイトの通常のエンジンを内部で使用するため、通常の構文とPCRE( PREG_* )はわずかに異なります。


通常のパターン構文の問題により、交換の理由が無効です

  1. PCRE構文はサポートされていません

MB_EREGI_REPLACEは、PCREではなくMBregexレギュラーエンジンを使用します。多くの開発者は、 MB_EREGI_REPLACE$パターンはPCREスタイルのセパレーター/を含めることができず、PCRE構文機能をサポートしていない一方、PCRE構文( /パターン /Iを使用してケースを無視するなど)を使用することに慣れています。

エラー例:

 mb_eregi_replace('/abc/', 'xyz', $str);

正しい使用法は次のとおりです。

 mb_eregi_replace('abc', 'xyz', $str);

MB_EREGI_REPLACE自体はケースに依存しないため、追加/区切り文字とIモディファイ剤を追加する必要はありません。

  1. 誤った脱出文字

Mbregexでは、一部の特殊文字と脱出方法はPCREとは異なります。たとえば、 \ dを使用して数値クラスを表すことはサポートされず、 [0-9]を使用する必要があります。

エラー例:

 mb_eregi_replace('\d+', '番号', $str);

正しい例:

 mb_eregi_replace('[0-9]+', '番号', $str);
  1. 誤用を一致させるマルチバイト文字

正規表現は、マルチバイト文字の特性に適応する必要があります。パターンが単純すぎる場合、またはシングルバイトの仮定が使用される場合、一致が失敗します。


実際の例

段落があるとします。

 $str = "Hello mb_eregi_replace example with M66.net URL.";

エラー書き込み(PCREセパレーターを使用)

 echo mb_eregi_replace('/m66\.net/', 'example.com', $str);

リミッターとして認識されていないため、これは正常に交換されません。

正しい書き込み

echo mb_eregi_replace('m66\.net', 'example.com', $str);

まとめ

  • MB_EREGI_REPLACEは、PCREスタイルのセパレーターと修飾子をサポートしていません。

  • 正規表現は、Mbregex構文の仕様に従う必要があります。

  • 誤ったパターンにより、関数がターゲット文字列と一致しなくなり、自然な交換が無効です。

  • マルチバイト文字を一致させるときは、正しい文字セット範囲と脱出方法を使用することにもっと注意を払う必要があります。

MB_EREGI_REPLACEの定期的な構文仕様を理解することで、機能をよりよく使用し、無効な落とし穴の交換を避けることができます。


 <?php
// 正しいサンプルコード:ドメイン名を文字列に入れますm66.net置き換えますexample.com

$str = "URLにアクセスしてください:http://m66.net/path?query=1";

// 知らせ:mb_eregi_replace通常のセパレーターは必要ありません,デフォルトのケースが無関心です
$result = mb_eregi_replace('m66\.net', 'example.com', $str);

echo $result;  // 出力:URLにアクセスしてください:http://example.com/path?query=1
?>