ホームページ >バックエンド開発 >PHPチュートリアル >UTF-8 がサポートされているにもかかわらず、 preg_match() のオフセットが文字ではなくバイト単位になるのはなぜですか?
preg_match() と PREG_OFFSET_CAPTURE パラメータを使用して UTF-8 文字列を照合すると、ユーザーは予期しないエラーに遭遇する可能性がありますオフセットが文字ではなくバイト単位でカウントされる動作。パターンとサブジェクトの両方で UTF-8 サポートを有効にする u 修飾子を使用しているにもかかわらず、キャプチャされたオフセットはバイトベースのままです。
この不一致に対処し、取得するには文字ベースのオフセットの場合は、mb_strlen を含む回避策を使用できます。この関数は、指定された部分文字列の UTF-8 文字数を提供します。キャプチャされた一致に先行する対象文字列の部分文字列で mb_strlen を利用することで、正確な文字オフセットを取得できます。
変更された例は次のとおりです:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1])); // Outputs 1
mb_strlen を組み込むことで、次のことが保証されます。オフセットは UTF-8 文字列内の文字の位置を表し、正確で期待される結果を提供します。
以上がUTF-8 がサポートされているにもかかわらず、 preg_match() のオフセットが文字ではなくバイト単位になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。