Отлавливайте неожиданные варианты с помощью getopt

Я пишу 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();
}

Есть ли хороший способ проверить неисключенные параметры во всем этом случае?

Спасибо за помощь!


person Devatoria    schedule 19.08.2014    source источник


Ответы (2)


Вы можете попробовать следующее:

// 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 предоставит вам варианты, которые находятся в массиве, которые недействительны.

person Eduardo Romero    schedule 19.08.2014
comment
Спасибо за помощь. Однако, если я запускаю свой скрипт, используя php myscript.php -nh, nh считается неожиданным, пока это так. Я отредактировал ваш код, чтобы он справился с этим. Еще раз спасибо. - person Devatoria; 20.08.2014

Способ найти неожиданные короткие опции, полагаясь на метод разбора 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, особенно если вы хотите проверить и длинные опции.

person Victor    schedule 24.04.2015