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;
}
看起来很简单,但我不清楚这是否是我想要做的最好的实现。也就是说,我只需要首先按引号的部分将字符串拆分为子字符串数组,然后按空格(在非引用的部分中,即)。它应该像我网站上的实际命令提示符一样。
洞察力表示赞赏。
答案 0 :(得分: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/
答案 1 :(得分:1)
您可以尝试使用python的optparse模块的这个端口:https://github.com/lelutin/php-optparse,或者这个较新的库:https://github.com/lelutin/php-options
两者似乎都非常强大,可能比从头编写自己的解析器更好。