ホームページ > バックエンド開発 > PHPチュートリアル > PHP の `preg_match()` および `PREG_OFFSET_CAPTURE` で UTF-8 文字オフセットを正しく処理するにはどうすればよいですか?

PHP の `preg_match()` および `PREG_OFFSET_CAPTURE` で UTF-8 文字オフセットを正しく処理するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-03 02:24:09
オリジナル
631 人が閲覧しました

How Can I Correctly Handle UTF-8 Character Offsets with PHP's `preg_match()` and `PREG_OFFSET_CAPTURE`?

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

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