PREG_OFFSET_CAPTURE とマルチバイト文字: カウントの不一致の克服
u 修飾子を付けて preg_match() を使用すると、パターンと件名の両方が次のように解釈されます。 UTF-8でエンコードされています。ただし、この修飾子を使用しても、キャプチャされたオフセットはバイト単位でカウントされます。この不一致は、UTF-8 文字ベースのインデックスを期待する場合に混乱を引き起こす可能性があります。
PREG_OFFSET_CAPTURE でバイトをカウントする PHP の性質
preg_match() は Unicode 文字を扱いますが、 PREG_OFFSET_CAPTURE は依然としてバイトカウントメカニズムを使用して実装されています。これは、UTF-8 などのマルチバイト表現の文字が複合文字ではなく個別のバイトとしてカウントされることを意味します。
解決策: mb_strlen を利用する
適切な文字列を取得するにはUTF-8 文字列の文字ベースのインデックスを使用するには、mb_strlen() 関数を利用できます。この関数は、UTF-8 文字列の長さを文字単位で提供できます。これをコードに組み込むことで、PREG_OFFSET_CAPTURE からのバイトベースのオフセットを対応する UTF-8 文字インデックスに変換できます。
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1])); // Output: 1
この例では、mb_strlen() は文字列の文字長を計算します。 PREG_OFFSET_CAPTURE から取得したオフセットに置き換えることにより、正しい UTF-8 インデックスが提供されます。この回避策により、Unicode 文字列を操作するときに期待どおりに正確な文字カウントが保証されます。
以上がPHP の `preg_match()` および `PREG_OFFSET_CAPTURE` で UTF-8 文字オフセットを正しく処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。