Разбор параметров командной строки PHP, как
-
06-07-2019 - |
Вопрос
Я использую Console_Getopt в PHP 5.2 и нахожу удивительным, насколько он отличается от getopt в других языках (perl, bash, java). Может кто-нибудь порекомендовать, как разобрать аргументы из массива " $ opts " вернулся?
php myprog.php -a varA -c -b varB
$o= new Console_Getopt;
$opts = $o->getopt($argv, "a:b:c");
print_r($opts);
// print_r возвращается ниже
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => varA
)
[1] => Array
(
[0] => c
[1] =>
)
[2] => Array
(
[0] => b
[1] => varB
)
)
[1] => Array
(
)
)
Я начал делать что-то похожее на приведенное ниже, что очень скучно, поэтому я ищу предложения по работе с флагами командной строки в php.
foreach($opts[0] as $i -> $keyval) {
list($key, $val) = $keyval;
if($key == 'a') {
print "valueForA: $val\n";
} else if($key == 'b') {
print "valueForB: $val\n";
} else if($key == 'c') {
print "c is set\n";
}
}
Интересно, почему PHP getopt не похож на Perl, где ключ массива - это флаг, например, $ opts {'a'} .. это было бы удобно.
Решение
Согласно встроенной документации
Возвращаемое значение представляет собой массив из двух элементов: список проанализированных параметры и список неопционных аргументов командной строки. Каждая запись в список проанализированных опций представляет собой пару элементов - первый указывает параметр, а второй - аргумент параметра, если бы был один.
Это означает, что вы легко отбрасываете второй массив и берете на себя обязательство сохранять массив массивов, параметр первого элемента, значение второго элемента, формат.
С этим предположением попробуйте
$o= new Console_Getopt;
$opts = $o->getopt($argv, "a:b:c");
print_r(getHashOfOpts($opts));
function getHashOfOpts($opts) {
$opts = $opts[0];
$return_opts = $opts;
$return_opts = Array();
foreach($opts as $pair){
$return_opts[$pair[0]] = $pair[1];
}
return $return_opts;
}
чтобы получить структуру данных по своему вкусу.
Относительно того, почему это отличается от других реализаций getopt, спросите сопровождающих . Р>
Другие советы
Проверьте GetOptionKit для PHP:
https://github.com/c9s/php-GetOptionKit
Описание
use GetOptionKit\OptionCollection;
use GetOptionKit\OptionParser;
$options = new OptionCollection;
$options->add( 'f|foo:' , 'option require value' ); # returns spec object.
$options->add( 'b|bar+' , 'option with multiple value' );
$options->add( 'z|zoo?' , 'option with optional value' );
$options->add( 'f|foo:=i' , 'option require value, with integer type' );
$options->add( 'f|foo:=s' , 'option require value, with string type' );
$options->add( 'v|verbose' , 'verbose flag' );
$options->add( 'd|debug' , 'debug flag' );
$parser = new OptionParser($options);
$result = $parser->parse( array( 'program' , '-f' , 'foo value' , '-v' , '-d' ) );
$spec = $result->verbose;
$spec = $result->debug;
$spec->value; # get value
GetOptionKit \ OptionPrinter может распечатать параметры для вас:
* Available options:
-f, --foo option requires a value.
-b, --bar option with multiple value.
-z, --zoo option with optional value.
-v, --verbose verbose message.
-d, --debug debug message.
--long long option name only.
-s short option name only.
Я написал класс-оболочку для getopt (), похожий на Console_GetOpt, но я думаю, что это немного лучше.
Вы можете найти его здесь: http://github.com/pete-otaqui/ClipClop р>
Парсер параметров PHP, основанный на getopt ().
ClipClop позволяет легко создавать инструменты командной строки с параметрами. ClipClop автоматически генерирует красиво отформатированные инструкции по использованию, а также предоставляет удобный API для доступа к параметрам и значениям.
ClipClop обрабатывает обязательные и необязательные параметры и значения для них. Таким образом, данный параметр, такой как «подробный» может быть обязательным или необязательным сам по себе, и не может иметь значения параметра, или необязательного, или обязательного.
ClipClop управляет несколькими значениями, хотя по умолчанию применяет отдельные значения, может проверять регулярные выражения и может анализировать для вас определенные типы: целые числа, числа, json и urls.
Быстрый пример Создайте скрипт с именем «environment_test», со следующим кодом
#!/usr/bin/env php
<?php
// do this unless you have setup an Autoloader
require_once('/path/to/ClipClop.php');
$clipclop = new ClipClop();
$clipclop->addOption(array(
'short' => 'e', // shortname, i.e. "-e"
'long' => 'environment', // longname, i.e. "--environment"
'value' => TRUE, // A value must be given such as "--environment=TEST"
'help' => 'Set the environment', // help text for the 'usage' text
'required' => TRUE, // Environment must be provided
));
// as soon as we ask for an option, ClipClop will parse CLI arguments with getopt()
$environment = $clipclop->getOption('e'); // returns the value set for 'e' OR 'environment'
print "You ran this script with environment: $environment";
?>
Он включает в себя различные другие параметры и модульные тесты.
Что бы это ни стоило, я недавно взломал небольшой собственный проект для разбора параметров командной строки в PHP. Я называю это Pharse (как " PHP Parse " ... вроде). Он доступен для скачивания на github здесь:
https://github.com/chrisallenlane/Pharse
Он был так сильно вдохновлен Trollop , что вы почти могли считать его портом, хотя я не реализовал все функции, которыми обладает Trollop. (Мне не нужны были некоторые функции - например, подкоманды - для моих собственных целей, поэтому я не стал беспокоиться.)
Общая суть библиотеки заключается в том, что для ее использования требуется один базовый файл, а затем передача классу Pharse одного ассоциативного массива опций. Например:
<?php
# specify some options
$options = array(
'user_name' => array(
'description' => 'Your username',
'default' => 'admin',
'type' => 'string',
'required' => true,
'short' => 'u',
),
'password' => array(
'description' => 'Your password',
'default' => 'sexsecretlovegod',
'type' => 'string',
'required' => true,
),
);
# You may specify a program banner thusly:
$banner = "This program logs you in to the Gibson.";
Pharse::setBanner($banner);
# After you've configured Pharse, run it like so:
$opts = Pharse::options($options);
?>
Я написал пост в блоге, в котором представляю библиотеку здесь:
http : //chris-allen-lane.com/2012/03/pharse-a-library-for-php-command-line-option-parsing/
Я взломал библиотеку для случайного использования для моих личных проектов, поэтому я должен быть осторожен перед развертыванием этого сценария в производственной среде. Я даже не удосужился реализовать правильные юнит-тесты, так что будьте осторожны.
С учетом сказанного, я думаю, что это довольно изящный маленький сценарий, и я думаю, что он идеально подходит для хобби-проектов и тому подобного.