好的,所以PHP有一个内置的getopt()函数,它返回有关用户提供的程序选项的信息。只是,除非我遗漏了什么,否则它完全被淹没了!从手册:
选项的解析将在找到的第一个非选项中结束,后面的任何内容都将被丢弃。
所以getopt()
只返回一个包含有效和解析选项的数组。您仍然可以通过查看$argv
来查看整个原始命令行,该getopt()
仍未修改,但是如何告诉 在该命令行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] =>
)
)
我应该期待将以下数组返回给我:
FILE
所以问题是:地球上我应该知道三个未解析的非选项$argv[ 3 ]
参数从{{1}}开始???
答案 0 :(得分:3)
从PHP 7.1开始,getopt
支持可选的by-ref参数&$optind
,其中包含参数解析停止的索引。这对于将标志与位置参数混合很有用。 E.g:
user@host:~$ 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
)
答案 1 :(得分: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 :(得分: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
。答案 3 :(得分:0)