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

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/04/29 16:12:59
  • 終了:2010/05/04 19:01:11

ベストアンサー

id:Bombastus No.2

ホーエンハイム回答回数409ベストアンサー獲得回数522010/04/29 19:41:08

ポイント35pt

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

日本語対応が必要なことが多いので、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);
?>
id:kaiketsu

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

2010/05/04 19:01:01

その他の回答(1件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812010/04/29 19:08:53

ポイント35pt

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

<?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

id:Bombastus No.2

ホーエンハイム回答回数409ベストアンサー獲得回数522010/04/29 19:41:08ここでベストアンサー

ポイント35pt

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

日本語対応が必要なことが多いので、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);
?>
id:kaiketsu

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

2010/05/04 19:01:01

コメントはまだありません

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

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

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

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