2013-10-03 16 views
22

OK、PHPには、ユーザーが提供しているプログラムオプションに関する情報を返す、getopt()関数が組み込まれています。私が何かが欠けていない限り、それは完全に骨抜きにされています!マニュアルから:PHPのgetopt()を使用した後、どのような引数が残っているかをどのように知ることができますか?

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

のでgetopt()は、有効なとの配列を返すだけオプションが解析されました。 を見ても元のコマンドライン全体を見ることができますが、変更されないままですが、ののどこで引数の解析が中止されたかをにどのように伝えますか?残りのコマンドラインを他のもの(ファイル名など)として扱う場合は、これを知ることが不可欠です。

$args = getopt('abc'); 

:その後、私はこのようなgetopt()を呼ぶかもしれない

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

Options: 
    -a something 
    -b something 
    -c something 

:ここ

は例です...

私は、次の引数を受け入れるようにスクリプトを設定するとしますそして、私がこのようなスクリプトを実行した場合:

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

私は、次の配列が私に戻ってきたことを期待すべきである:

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

そこで質問はこれです:どのように地球上で私は3解析対象外、非オプションFILE引数は$argv[ 3 ]で始めることを知っているはずですか? ??

+1

あなたはConsole_GetOpt(http://stackoverflow.com/questions/1023095/phps-command-line-option-parsing-howto)に見ることができるが、それはPEARが必要です。 – andig

+0

'$ argv [count($ argv) - 1]' – EaterOfCode

+2

@EaterOfCode:できないようにファイルを最後のパラメータとして指定しました。任意の数のファイルを指定することができるので、解析されていない非オプション引数の数が最後にいくつあるかを知る必要があります。 – edam

答えて

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"; 

私はいつもそのようにして動作します。さらに、私はそれで欲しいものを何でもすることができます。

+2

ええ、しかし、私は自分自身を育てるのではなく、組み込みのライブラリを使うことができます1つは私の周りどこでも。私の例では、 '-bccc'コマンドラインパラメータのように、あなたのサンプルコードでは扱えません。もっと完全なものがあると確信していますPHPのためのコマンドラインパーサの例がありますが、この種の問題を克服してください!) – edam

+0

単に 'strtok'を使用してforeachを実行すると結果が改善されます。 – Gasol

+1

私はいくつかの状況に遭遇しました。ここでは、PHPの組み込み関数がマークを少し逃してしまい、自分でビルドする必要がありました。私は、PHPが組み込んだ関数が答えることのできない問題を創造的に解決しようとしているので、これを落とすべきではないと思います。それは完璧な答えではありませんが、それは嘘つきではありません。 – n0nag0n

2

次のコマンドラインオプションの引数を取得するために使用できます。 それは前または結果が変化しないとPHPのgetopt()を呼び出した後に使用することができます。

# $options = getopt('cdeh'); 

$argx = 0; 

while (++$argx < $argc && preg_match('/^-/', $argv[$argx])); # (no loop body) 

$arguments = array_slice($argv, $argx); 

$argumentsは今、先頭のオプションを以下のいずれかの引数が含まれています。 また、引数を別の配列に入れたくない場合は、$argxが最初の実際の引数のインデックス($argv[$argx])になります。その後、任意の主要なオプション、後

引数が指定されていない場合は

、:

  • $argumentsは空の配列[]、および
  • count($arguments) == 0、および
  • $argx == $argcです。
+0

これはひどい答えです! '-'で始まるコマンドライン引数をスキップし、残りがオプションではない引数であることを前提としています!コマンドラインで './example --name Bob -s 23'を実行するとどうなりますか?ここでは、オプションの引数がないこともあります(--nameと-sの両方がオプション引数をとる場合)。 '[" Bob "、" -s "、" 23 "]'オプションの引数。問題は*あなたがオプションを解析するまで*どの引数がオプションでない引数であるかを知ることができないことです。 PHPの 'getopt()'は、どの引数がオプションの一部でないかを示す必要があります。そしてそれはしません。 – edam

0

GetOptionKitを見て、フラグの解析を取り除いてください。

http://github.com/c9s/GetOptionKit

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

+0

ありがとうございます。私はこれを行うための他の図書館があることを知っています。 PHPのネイティブ 'getopt()'関数を使ってそれを行う方法があるのか​​どうか疑問に思っただけです。しかし、そこにはないようだ。 – edam

3

PHP 7.1より、getoptは、オプションのby-refパラメータをサポートしています。&$optindには、引数の解析が停止したインデックスが含まれています。これは、フラグを位置引数と混合するのに便利です。例えば:

[email protected]:~$ php -r '$i = 0; getopt("a:b:", [], $i); print_r(array_slice($argv, $i));' -- -a 1 -b 2 hello1 hello2 
Array 
(
    [0] => hello1 
    [1] => hello2 
) 
関連する問題