使用getopt捕获意外选项

8

我正在编写一段 PHP 脚本,并需要获取一些选项(h,n 和 v)。对于我来说,最好的方法是使用 getopt 函数。此外,如果传递了意外的选项,我想显示帮助消息。但是,getopt 函数只返回期望的选项。

以下是我的脚本:

$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,它将会运行,因为选项数组为空。

php myscript.php -p

如果我将一个意外的选项与一个预期的选项一起传递,它也会运行。
php myscript.php -pn
php myscript.php -p -n

我尝试检查传递的参数数量,但这只适用于逐个传递参数(-n -p),而不是全部放在一起传递(-np)。

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

有没有一种好的方法来检查所有情况下的意外选项?

谢谢你的帮助!

2个回答

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)));
< p > array_diff会给你数组中无效的选项。


谢谢你的帮助。然而,如果我使用 php myscript.php -nh 启动我的脚本,nh 被认为是意外的,但实际上它是有意义的。我编辑了你的代码来处理这个问题。再次感谢你。 - Devatoria

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等工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接