27

さて、PHP には組み込みのgetopt()関数があり、ユーザーが指定したプログラム オプションに関する情報を返します。ただ、私が何かを見逃していない限り、それは完全にボークです! マニュアルから:

オプションの解析は、最初の非オプションが見つかった時点で終了し、その後に続くものはすべて破棄されます。

そのため、有効で解析済みのオプションのみgetopt()を含む配列を返します。変更されていないままの を見ると、元のコマンドライン全体をまだ見ることができます、そのコマンドラインのどこで引数の解析を停止したかをどのように確認できますか? コマンドラインの残りの部分を他のもの (ファイル名など) として扱いたい場合は、これを知っておくことが不可欠です。$argvgetopt()

ここに例があります...

次の引数を受け入れるようにスクリプトを設定するとします。

Usage: test [OPTION]... [FILE]...

Options:
  -a  something
  -b  something
  -c  something

次に、次getopt()のように呼び出します。

$args = getopt( 'abc' );

そして、次のようにスクリプトを実行した場合:

$ ./test.php -a -bccc file1 file2 file3

次の配列が返されることを期待する必要があります。

Array
(
    [a] =>
    [b] =>
    [c] => Array
        (
            [0] =>
            [1] =>
            [2] =>
        )
)

問題は次のとおりです。解析されていないオプションのない3つのFILE引数が$argv[ 3 ]???で始まることを一体どのように知る必要があるのでしょうか。

4

4 に答える 4

2

getopt を使用していないとは誰も言っていません。好きな方法でそれを行うことができます:

$arg_a = null; // -a=YOUR_OPTION_A_VALUE
$arg_b = null; // -b=YOUR_OPTION_A_VALUE
$arg_c = null; // -c=YOUR_OPTION_A_VALUE

$arg_file = null;  // -file=YOUR_OPTION_FILE_VALUE

foreach ( $argv as $arg )
{
    unset( $matches );

    if ( preg_match( '/^-a=(.*)$/', $arg, $matches ) )
    {
        $arg_a = $matches[1];
    }
    else if ( preg_match( '/^-b=(.*)$/', $arg, $matches ) )
    {
        $arg_b = $matches[1];
    }
    else if ( preg_match( '/^-c=(.*)$/', $arg, $matches ) )
    {
        $arg_c = $matches[1];
    }
    else if ( preg_match( '/^-file=(.*)$/', $arg, $matches ) )
    {
        $arg_file = $matches[1];
    }
    else
    {
        // all the unrecognized stuff
    }
}//foreach

if ( $arg_a === null )    { /* missing a - do sth here */ }
if ( $arg_b === null )    { /* missing b - do sth here */ }
if ( $arg_c === null )    { /* missing c - do sth here */ }
if ( $arg_file === null ) { /* missing file - do sth here */ }

echo "a=[$arg_a]\n";
echo "b=[$arg_b]\n";
echo "c=[$arg_c]\n";
echo "file=[$arg_file]\n";

私はいつもそのようにしていますが、うまくいきます。さらに、私はそれでやりたいことが何でもできます。

于 2013-10-03T13:56:03.517 に答える
0

フラグの解析を取り除くには、GetOptionKit を参照してください。

http://github.com/c9s/GetOptionKit

GetOptionKit は、コマンド ライン スクリプトに簡単に統合できます。型制約、値の検証などをサポートしています。

于 2016-05-20T12:22:13.267 に答える