3

私は PHP 5.2 で Console_Getopt を使用していますが、他の言語 (perl、bash、java) の getopt との違いに驚かされます。返された配列「$ 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 が、配列のキーが $opts{'a'} などのフラグである perl のようにならないのはなぜかと思います。

4

4 に答える 4

4

PHPのGetOptionKitを確認します。

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.
于 2011-11-29T07:03:53.733 に答える
3

インラインドキュメントによると

戻り値は、解析されたオプションのリストとオプション以外のコマンドライン引数のリストの 2 つの要素の配列です。解析されたオプションのリストの各エントリは要素のペアです。最初の要素はオプションを指定し、2 番目の要素はオプション引数 (存在する場合) を指定します。

つまり、2 番目の配列を簡単に破棄し、配列の配列、最初の要素のオプション、2 番目の要素の値、形式を保持することを約束します。

その前提で、試してみてください

$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 の他の実装と異なる理由については、メンテナーに尋ねてください。

于 2009-06-21T03:36:08.260 に答える
1

Console_GetOpt に似た 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";
?>

その他のさまざまなオプションと単体テストが含まれています。

于 2012-09-03T09:44:33.670 に答える
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/

私は個人的なプロジェクトで気軽に使用するためにライブラリをハッキングしたので、このスクリプトを運用環境に展開する前に注意が必要です。私はまだ適切な単体テストを実装することさえできていないので、注意してください。

とはいえ、かなり気の利いた小さなスクリプトだと思いますし、趣味のプロジェクトなどには最適だと思います。

于 2012-03-31T19:19:57.473 に答える