我在PHP 5.2中使用Console_Getopt,并且发现令人惊讶的是它与其他语言中的getopt有多么不同(perl,bash,java)。任何人都可以推荐如何从数组“$ opts”中解析args?
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'} ..这很方便。
答案 0 :(得分:4)
检查GetOptionKit for 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.
答案 1 :(得分:3)
根据内联文档
返回值是两个元素的数组:已解析的列表 选项和非选项命令行参数列表。每个条目 解析选项列表是一对元素 - 第一个 指定选项,第二个指定选项参数, 如果有的话。
这意味着您可以轻松地丢弃第二个数组,并承诺保留数组数组,第一个元素选项,第二个元素值,格式。
有了这个假设,试试
$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的其他实现不同,请问the maintainers。
答案 2 :(得分:1)
我在getopt()周围写了一个包装类,类似于Console_GetOpt,但我觉得有点好。
您可以在此处找到它:http://github.com/pete-otaqui/ClipClop
基于getopt()的PHP选项解析器。
ClipClop允许您使用选项轻松创建命令行工具。 ClipClop自动生成格式良好的使用说明,并为访问参数和值提供了方便的API。
ClipClop处理必需和可选参数及其值。因此,诸如“--verbose”之类的给定选项本身可以是必需的或可选的,并且它可以没有参数值或可选的参数值或必需的参数值。
ClipClop管理多个值,虽然默认情况下强制执行单个值,但可以针对正则表达式进行验证,并且可以为您解析出某些类型:整数,数字,json和url。
快速示例 使用以下代码
创建一个名为“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";
?>
它包括各种其他选项和单元测试。
答案 3 :(得分:0)
为了它的价值,我最近在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/
我为了个人项目而将图书馆随意使用,因此在将此脚本部署到生产环境之前我会谨慎使用。我还没有开始实施适当的单元测试,所以你要警告。
尽管如此,我认为这是一个非常漂亮的小脚本,我认为它非常适合爱好项目等。