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)使您的代码适合这些测试,然后添加更多极端情况 - 例如,未闭合的引号。

如果您要构建的是真正的命令行(即 shell),请考虑使用开源项目,例如。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 回答