preg_match() で一致する前にマルチバイト文字数を取得
問題:
実行時preg_match() を使用して、UTF-8 でエンコードされた文字列に対する正規表現の一致PREG_OFFSET_CAPTURE パラメータを使用すると、結果のオフセットは文字数ではなくバイト単位で計算されます。マルチバイト文字を照合する場合、バイト長が文字長と異なる可能性があるため、これは問題となる可能性があります。
たとえば、次のコードを使用して UTF-8 エンコード文字列の「H」文字と照合すると、結果は文字「H」がインデックスにあるにもかかわらず、オフセットは 2 です1:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo $a_matches[0][1];
解決策:
正しい文字数オフセットを取得するには、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]));
これにより、UTF-8 文字でオフセットが計算され、正しい結果が得られます。
以上がPREG_OFFSET_CAPTURE を使用した preg_match() の後に UTF-8 文字列の正しい文字オフセットを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。