【发布时间】:2013-10-03 12:25:30
【问题描述】:
好的,所以 PHP 有一个内置的getopt() 函数,它返回有关用户提供的程序选项的信息。只是,除非我错过了什么,否则它完全是无聊的!来自手册:
选项的解析将在找到的第一个非选项处结束,随后的任何内容都将被丢弃。
所以getopt() 只返回一个带有 valid 和 parsed 选项的数组。通过查看$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 ] 开始???
【问题讨论】:
-
您可以查看 Console_GetOpt (stackoverflow.com/questions/1023095/…),但它需要 PEAR。
-
您将文件指定为最后一个参数,因此您可以执行
$argv[count($argv) - 1] -
@EaterOfCode:这还不够。您可以指定任意数量的文件,因此您需要知道最后有多少未解析的非选项参数。
-
如果您没有需要值或可选值的参数,您可以简单地修剪所有以连字符开头的
$argv元素,只留下非选项参数:preg_grep('/^-/', $argv, PREG_GREP_INVERT) -
哈哈,在解决了这个问题 30 分钟后,我找到了自己的旧评论。 ;) 解决方案仍然有价值。更新用法:
$argv = array_values(preg_grep('/^-/', $argv, PREG_GREP_INVERT));