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;
}