ホームページ >バックエンド開発 >PHPチュートリアル >PREG_OFFSET_CAPTURE を使用した preg_match() の後に UTF-8 文字列の正しい文字オフセットを取得する方法

PREG_OFFSET_CAPTURE を使用した preg_match() の後に UTF-8 文字列の正しい文字オフセットを取得する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-03 01:01:091019ブラウズ

How to Get the Correct Character Offset in UTF-8 Strings After a preg_match() with PREG_OFFSET_CAPTURE?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。