最終更新日 2006年1月16日 up top

PHPで空白をクォーテーションした文字列のパース処理

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