PHPのstrtok関数について質問です。

strtok関数を使って文字列 "サッカー スポーツ"
を " "(全角空白) で分割しようとすると、
次のように分割されます。

array(4) {
[0]=>
string(6) "サッカ"
[1]=>
string(1) "["
[2]=>
string(4) "スポ"
[3]=>
string(4) "[ツ
"
}

伸ばし棒 "ー" がはいっていなければ、普通に分割できるのですが、
何か、対策、もしくは原因について心当たりのあるかた教えていただけないでしょうか。

回答の条件
  • 1人1回まで
  • 登録:2009/02/17 16:28:50
  • 終了:2009/02/19 09:46:28

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/02/17 18:01:22

ポイント35pt

strtok は第二引数に含まれている文字の

”いずれかに該当”すれば分割点だと解釈しますので

例えば "ab" と与えれば"a"か"b"いずれかで分割します。


そして問題となるのが strtok がマルチバイト非対応という点です。

全角スペースはマルチバイトですからスペース1文字のつもりが

内部的には複数の文字で構成されているため、それぞれの構成文字が

分割対象とされ、結果として思い通りの分割は行ってくれません。


mb_split などのマルチバイトに対応した関数を利用してください。

id:shotaroh5663

助かりました!ありがとうございます。

2009/02/19 09:46:07

その他の回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/02/17 18:01:22ここでベストアンサー

ポイント35pt

strtok は第二引数に含まれている文字の

”いずれかに該当”すれば分割点だと解釈しますので

例えば "ab" と与えれば"a"か"b"いずれかで分割します。


そして問題となるのが strtok がマルチバイト非対応という点です。

全角スペースはマルチバイトですからスペース1文字のつもりが

内部的には複数の文字で構成されているため、それぞれの構成文字が

分割対象とされ、結果として思い通りの分割は行ってくれません。


mb_split などのマルチバイトに対応した関数を利用してください。

id:shotaroh5663

助かりました!ありがとうございます。

2009/02/19 09:46:07
id:palo No.2

palo回答回数124ベストアンサー獲得回数142009/02/17 21:00:23

ポイント35pt

strtok関数ではマルチバイト文字列を取り扱えません。

たとえば、mb_split関数なら下のように使えます。

$string = "サッカー スポーツ";

$a = mb_split("[ ]", $string);

print_r($a);

// Array ( [0] => サッカー [1] => スポーツ )

PHP: mb_split - Manual

id:shotaroh5663

助かりました!ありがとうございます。

2009/02/19 09:46:10
  • id:tobeoscontinue
    " "(全角空白) をなにか別の文字(例えば空白)に変えてからstrtokするという手もあります。
    strtok(str_replace(' ', ' ', $string), ' ');
    strtok(' ');
    ただUTF-8以外では希望するようには動かないかもしれませんが。
  • id:shotaroh5663
    shotaroh5663 2009/02/21 11:21:18
    ご回答いただき、ありがとうございます。
    実は、mb_splitでも上手くいっていないので、
    その方法を試させていただこうと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません