使用getopt捕获意外的选项

时间:2014-08-19 16:08:00

标签: php getopt

我正在编写一个PHP脚本,必须得到一些选项(h,n和v)。对我来说,获得它的最好方法是使用getopt函数。此外,如果传递了意外的选项,我想显示帮助信息。但是,getopt函数只返回expteced选项。

这是我的剧本:

$options = getopt('hnv');

if (!empty($options)) {
    foreach (array_keys($options) as $option) {
        switch ($option) {
            // Run script.
            case 'n':
            case 'v':
                break;
            case 'h':
                // Display help with OK exit code.
                self_usage();
                exit(0);
            default:
                // Display help with ERR exit code.
                self_usage('Too many params');
                exit(1);
        }
    }
}

但是,如果我使用-p之类的意外选项启动我的脚本,它会运行,因为options数组为空。

php myscript.php -p

如果我使用预期选项传递意外选项,它也会运行。

php myscript.php -pn
php myscript.php -p -n

我已经尝试检查传递的args计数,但这只有在我逐个传递参数(-n -p)而不是一次传递(-np)时才有效。

if ((count($argv) - 1) > count($options)) {
    self_usage();
}

在所有这种情况下,有没有一种方法可以检查未被发现的选项?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

// remove script called
unset($argv[0]);
$valid_opts = getopt('hnv');
array_walk($argv, function(&$value, $key) {
    // get rid of not opts
    if(preg_match('/^-.*/', $value)) {
        $value = str_replace('-', '', $value);    
    } else {
        $value = '';
    }

});
$argv = array_filter($argv);
print_r($argv);
print_r($valid_opts);

print_r(array_diff($argv, array_keys($valid_opts)));

array_diff将为您提供数组中无效的选项。

答案 1 :(得分:0)

依赖于getopt解析方法找到意外的短选项的方法:

$all = getopt(implode('', array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'))));
$options = getopt('hnv');
$wrongOptions = array_diff(array_keys($all), array_keys($options));
if (!empty($wrongOptions)) {
    echo("Wrong options: " . implode(', ', $wrongOptions));
    exit(1);
}

您还可以查看zend.console.getopt等工具,尤其是如果您想验证长选项。