1
function parseCommandString( $str ) {
    $chunks = explode( '"', $str );
    $cmd = array();

    // Split the command into space-separated parameters (preserving quoted portions)
     $c = count($chunks);
    for( $i=0; $i<$c; $i++ ) {
        if( $i % 2 == 0 ) {
            if( $chunks[$i] == '' ) {
                continue;
            }

            $params = explode( ' ', $chunks[$i] );
             $pc = count($params);
            for( $j=0; $j<$pc; $j++ ) {
                if( $params[$j] != '' ) {
                    $cmd[] = $params[$j];
                }
            }
        } else {
            if( $chunks[$i] != '' ) {
                $cmd[] = $chunks[$i];
            }
        }
    }
    return $cmd;
}

簡単そうに見えますが、これが私がやりたいことの最良の実装であるかどうかについての洞察が不足しています。つまり、文字列を最初に引用符のセクションで、次にスペース(引用符で囲まれていないセクション内)で部分文字列の配列に分割する必要があります。これは、私のサイトの実際のコマンドプロンプトのようなものです。

洞察に感謝します。

4

2 に答える 2

2

これが私がこのプロジェクトにアプローチする方法です:

1)テストから始めます。例えば。

isEqual(parseCommandString('hello world', ["hello", "world"]));
isEqual(parseCommandString('hello "world a"', ["hello", "world a"]));

2)コードをこれらのテストに適合させてから、さらにコーナーケースを追加します(たとえば、閉じられていない引用符)。

ビルドしようとしているのが真のコマンドライン(つまりシェル)である場合は、オープンソースプロジェクトの使用を検討してください。http://code.google.com/p/php-web-shell/

于 2012-08-01T01:39:46.803 に答える
1

Pythonのoptparseモジュールのこのポートを試すことができます:https ://github.com/lelutin/php-optparse 、またはこの新しいライブラリ:https
://github.com/lelutin/php-options どちらもかなり強力なようで、おそらく、独自のパーサーを最初から作成するよりも優れています。

于 2012-08-01T01:42:04.430 に答える