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

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

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

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

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2009/02/19 09:46:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント35pt

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

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

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


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

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

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

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


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

id:shotaroh5663

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

2009/02/19 09:46:07

その他の回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント35pt

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

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

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


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

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

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

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


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

id:shotaroh5663

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

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

回答回数124ベストアンサー獲得回数14

ポイント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でも上手くいっていないので、
    その方法を試させていただこうと思います。

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

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

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

回答リクエストを送信したユーザーはいません