PHP的命令行选项解析,HOWTO(php's command line option pa

2019-09-16 15:04发布

我在PHP 5.2使用Console_Getopt,并发现它令人惊讶它是从其他语言(perl的,bash中,JAVA)getopt的有什么不同。 任何人都可以建议如何解析从数组中ARGS“$ OPTS”回来了?

PHP myprog.php -a翻-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”} ..这将是方便。

Answer 1:

每内嵌文档

返回值是两个元素的数组:解析的选项列表和非选项命令行参数的列表。 在解析的的选项列表中的每个条目是一对元件 - 的第一个指定的选项,和第二个指定的选项的参数,如果有一个。

这意味着你容易丢弃所述第二阵列,并且假设到数组的数组的保持,第一元件的选择,第二个元素的值,格式的承诺。

有了这样的假设,尝试

$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的不同,要求的维护者 。



Answer 2:

检查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.


Answer 3:

我写了一个包装类各地getopt的(),类似于Console_GetOpt但我觉得更好一点。

你可以在这里找到它: http://github.com/pete-otaqui/ClipClop

基于getopt的一个PHP解析器选项()。

ClipClop让您轻松创建选项命令行工具。 ClipClop自动生成很好的格式化的使用说明,并且还给出了用于访问参数和值的方便的API。

ClipClop处理它们所需和可选的参数,和值。 因此,一个给定的选项,例如“--verbose”,可以要求或本身可选的,它可以没有参数值或可选的一个或所需的一个。

ClipClop管理多个值,虽然在默认情况下强制执行单值,可以验证对正则表达式,可以解析出某些类型的你:整数,数字,JSON和网址。

简单的例子创建一个名为“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";
?>

它包括各种其它选项,和单元测试。



Answer 4:

对于它的价值,最近我砍死了我自己的命令行选项在PHP解析的一个小项目。 我把它叫做Pharse(如“PHP解析” ......那种)。 这是可供下载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/

我砍死了休闲使用图书馆为我的个人项目,所以我会部署这个脚本到生产环境之前,谨慎使用。 我还没有得到解决,以实现适当的单元测试呢,所以你们要警告。

虽这么说,不过,我觉得这是一个非常漂亮的小脚本,我认为这是完全适合爱好项目等。



文章来源: php's command line option parsing, howto