PHPで空白をクォーテーションした文字列のパース処理をしなければいけなかったので、頭をひねって考えてみた。 C言語であれば、ポインタでちょちょいのちょいであるが、PHPにはポインタはないし、 substrでポインタっぽいこともできるけど美しくないし、マルチワイド文字の処理で嫌な予感がしたので標準関数で処理。
// 解析 $rtn = parse( 'あああ いいい "ううう えええ" おおお "かかか きき"' ); // 表示 foreach( $rtn as $value ) { echo "$value\n"; } // 実行結果 // あああ // いいい // ううう えええ // おおお // かかか きき // function parse( $str ) { // 全角空白を半角に置換(必要な場合) // $str = str_replace( ' ', ' ', $str ); // クォーテーションの始まりのダブルクォーテーションに印を付ける // [[:space:]] を使うことにより、連続する空白にも対応 // 例「あああ いいい "ううう えええ" おおお "かかか きき"」→「あああ いいい "__quote__ううう えええ" おおお "__quote__かかか きき"」 // 先頭のダブルクォーテーションに $str = ereg_replace( '^"', '"__quote__', $str ); // 空白後のダブルクォーテーションに $str = ereg_replace( '[[:space:]]"', ' "__quote__', $str ); // ダブルクォーテーションで文字列分割 // 例「あああ いいい "__quote__ううう えええ" おおお "__quote__かかか きき"」→ // 例 $str[0] = 'あああ いいい '; $str[1] = '__quote__ううう えええ'; $str[2] = ' おおお '; $str[3] = '__quote__かかか きき'; $str = explode( '"', $str ); // $n = 0; $rtn = ''; foreach ( $str as $value ) { // 文字列の両端の余分な空白を消す $value = trim( $value ); // 文字列がないなら次のループへ if ( $value == '' ) continue; // もしその文字列がクォーテーションの一部なら if ( ereg( '__quote__', $value ) ) { // ユニークな文字列を削除して、格納 $value = str_replace( '__quote__', '', $value ); $rtn[$n] = $value; $n ++; } else { // 違うなら、空白文字で分割し、格納 $value = explode( ' ', $value ); foreach ( $value as $value2 ) { $tag[$n] = $value2; $n ++; } } } retrun $rtn; }