【问题标题】:php cli: using argv and getopt not workingphp cli:使用 argv 和 getopt 不起作用
【发布时间】:2013-04-04 08:15:45
【问题描述】:

尝试使用 argv 变量和 getopt() 似乎不起作用。任何人都知道除了使用所有 - 或 - 选项之外的解决方法:

<?php
$arr[] = "test:";
$options = getopt(NULL, $arr);
echo $options["test"];
?>

上面的简单示例,当我运行时:

php test.php --test="Hello World"

你好世界

php test.php argv --test="Hello World"

没有输出,因为我在它之前放置了一个没有 - 或 - 的值。

【问题讨论】:

  • php.net/getopt - “选项的解析将在找到第一个非选项时结束,随后的任何内容都将被丢弃。”
  • 是的,我现在注意到它说:“选项的解析将在找到的第一个非选项处结束,随后的任何内容都将被丢弃。”似乎很不方便。仍然期待解决方法。
  • 是的,看起来有点短视。尤其是无法提供函数的输入。
  • 尝试使用$_SERVER['argv']
  • 如果你的第一个参数总是一个命令,你可以在处理它之后从 $argv 数组中删除它。例如:$command = $argv[1]; array_shift($argv);

标签: php command-line-interface argv getopt


【解决方案1】:

这有点蛮力,但它更好地解决了我的相关问题。基于user3307546的回答:

function get_opts() {
    $opts = array();
    foreach($_SERVER["argv"] as $k => $a){
        if(preg_match( '@\-\-(.+)=(.+)@'  , $a, $m))
            $opts[$m[1]] = $m[2];
        elseif(preg_match( '@\-\-(.+)@'   , $a, $m))
            $opts[$m[1]] = true;
        elseif(preg_match( '@\-(.+)=(.+)@', $a, $m))
            $opts[$m[1]] = $m[2];
        elseif(preg_match( '@\-(.+)@'     , $a, $m))
            $opts[$m[1]] = true;
        else
            $opts[$k] = $a;
    }
    return $opts;
}

所以

> php cli/index.php gen/cache/reports -e --refresh-api -s="2020-04-16" -v

被解析为

{
    0: "cli/index.php",
    1: "ttd/cache/reports",
    "e": true,
    "refresh-api": true,
    "s": "2020-04-16",
    "v": true
}

所有“非选项”都以其在哈希键中的顺序位置出现。

【讨论】:

    【解决方案2】:
    function get_opt() {
        $options = array();
        foreach( $_SERVER[ "argv" ] as $key => $arg ) {
            if ( preg_match( '@\-\-(.+)=(.+)@', $arg, $matches ) ) {
                $key   = $matches[ 1 ];
                $value = $matches[ 2 ];
                $options[ $key ] = $value;
            } else if ( preg_match( "@\-(.)(.)@", $arg, $matches ) ) {
                $key   = $matches[ 1 ];
                $value = $matches[ 2 ];
                $options[ $key ] = $value;
            }
        }
        return $options;
    }
    

    【讨论】:

    • 即使您的答案可能是正确的,添加一点解释也不会伤害任何人,并且会鼓励其他用户支持您的答案。
    • 您的代码确实适用于我的示例,我会告诉您,但它不适用于实际使用。我自己做的,有机会我会发布的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2017-02-01
    • 2018-11-26
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多