ホームページ > バックエンド開発 > PHPチュートリアル > UTF-8 がサポートされているにもかかわらず、 preg_match() のオフセットが文字ではなくバイト単位になるのはなぜですか?

UTF-8 がサポートされているにもかかわらず、 preg_match() のオフセットが文字ではなくバイト単位になるのはなぜですか?

DDD
リリース: 2024-12-06 05:35:19
オリジナル
159 人が閲覧しました

Why are preg_match() Offsets in Bytes, Not Characters, Even with UTF-8 Support?

PREG_OFFSET_CAPTURE と UTF-8 文字列: バイトカウントの不一致

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート