1

このスニペットを確認してください:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
mb_ereg_search_init('καλημέραCCC', 'C+');
$pos = mb_ereg_search_pos();
echo $pos[0];

(この特定の例についてコメントしないでください。これは私の使用例ではなく、私が抱えている問題を軽減するためのものです)

文字列「καλημέρα」は 8 文字で構成されていますが、上記のスニペットは 16 を出力します。mb_ereg_search_init はマルチバイトをサポートするはずではありませんか? もしそうなら、私が必要とする組み込み関数はありますか?

前もって感謝します。

4

1 に答える 1

0

のマニュアルページからmb_ereg_search_pos

マルチバイト正規表現の一致部分の位置を含む配列。配列の最初の要素は一致部分の先頭になり、2 番目の要素は一致部分の長さ (バイト) になります。エラーの場合は FALSE を返します。

私の解釈では、実際の位置ではなく、常にバイト数を返しているということです。これらのマルチバイト関数をさらにチェックすると、このように動作するはずであることを示唆するものが少なくとももう 1 つあります。それでは、この関数の目的は何なのか聞かないでください...

first の位置だけを知りたい場合はC、次を使用できますmb_strpos

mb_strpos('καλημέραCCC', 'C'); // 8

どうしてもハッキングしたい場合は、解決策があります。最初に文字列をデコードする必要があります。

mb_ereg_search_init(utf8_decode('καλημέραCCC'), 'C+');

文字列は になり????????CCC、クエスチョン マークはそれぞれ 1 バイトで正確に数えることができます。ただし、正規表現でマルチバイト文字を使用したい場合 ( 'λ+')、機能しません。

于 2011-10-18T17:32:25.207 に答える