人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

http://q.hatena.ne.jp/1272522260 の質問ですが、言語依存で質問しなおします。 PHP4.3.9 で簡単に実現する方法あるでしょうか?

●質問者: kaiketsu
●カテゴリ:コンピュータ インターネット
✍キーワード:依存 言語
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● GoldenDawn
●35ポイント

簡単かどうかは分かりませんが。

<?php
$str = 'Macintosh "iPod Touch 8G" iPhone ' ;
preg_match_all('/"[^"]*?"|[^"\s]+/', $str, $mtch) ;
$keywords = array_map(create_function('$a', 'return trim($a, "\"");'), $mtch[0]) ;
print_r($keywords) ;

http://www.php.net/manual/ja/function.preg-match-all.php


2 ● ホーエンハイム
●35ポイント ベストアンサー

さすがに数行でというわけにはいきませんね。

日本語対応が必要なことが多いので、mb_substrを使った下記のような関数を用意して使っています。

<?php
//分割関数
function my_strtok($str, $token=' ', $quote='"') {
 $arr = array(); //結果を代入する配列
 $cnt = 0; //要素数
 $flag = FALSE; //TRUEならクォーテーション内
 $str = trim($str); //前処理
 for ($i = 0; $i < mb_strlen($str); $i++) {
 $c = mb_substr($str, $i, 1);
 //クォーテーション内
 if ($flag == TRUE) {
 if ($c == $quote) {
 $flag = FALSE;
 } else {
 $arr[$cnt] .= $c;
 }
 //クォーテーション
 } else if ($c == $quote) {
 $flag = TRUE;
 //区切り文字
 } else if ($c == $token) {
 $cnt++;
 $i++;
 while ($i < mb_strlen($str)) {
 $c = mb_substr($str, $i, 1);
 if ($c != $token) break;
 $i++;
 }
 $i--;
 //一般文字
 } else {
 $arr[$cnt] .= $c;
 }
 }
 return $arr;
}

$str ='Macintosh "iPod Touch 8G" iPhone';
$arr = my_strtok($str);
var_dump($arr);
?>
◎質問者からの返答

ですね。ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ