使用 PHP 从字符串中获取 $argv

Get $argv from a string with PHP

我们知道可以使用预定义变量从命令行轻松获取参数数组$argv

有没有简单的方法从字符串而不是命令行获取数组?
我需要为相关库编写一些测试。

例如,当您 运行 script.php -a b -c d,在 script.php
你可以得到 $argv["script.php", "-a", "b", "-c", "d"].
所以我的问题是,在 php 脚本中,
我怎样才能从字符串中获取这个数组,在这里说 "-a b -c d" 不是通过将字符串传递给命令行而是传递给变量?

我不需要解析这里的选项。

最简单的方法是:

$array = preg_split ("/\s+/", $str);

但是,这不能覆盖选项值中带有空格的字符串。
说:

-a "some thing"

好的,没有人回答这个问题,我会在这里提出一个解决方案:

function getArgv ($string) {
    global $argv;
    preg_match_all ('/(?<=^|\s)([\'"]?)(.+?)(?<!\\)(?=$|\s)/', $string, $ms);
    $argv = $ms[2];
}

getArgv("-a b -c d");
print_r ($argv);
getArgv('-a \'b  -c d\' -c "da  fwe\" a" awf="sadf"');
print_r ($argv);

输出:

Array(
    [0] => -a
    [1] => b
    [2] => -c
    [3] => d
)
Array
(
    [0] => -a
    [1] => b  -c d
    [2] => -c
    [3] => da  fwe\" a
    [4] => awf="sadf"
)

或者让 PHP 完成工作:

$arguments = '-a b -c d --efg="asd lol"';

$serializedArguments = shell_exec(
    sprintf('%s -r "echo serialize(\$argv);" -- %s', PHP_BINARY, $arguments)
);

var_dump(unserialize($serializedArguments));

根据@Slam 的回答(我不相信正则表达式能胜任那种工作),这是我最终得到的结果:

/**
 * Returns the argv array version of the given param string.
 * This function assumes that the php cli is available as "php" on your system.
 * 
 * @param string $str
 * @return array
 */
function paramStringToArgv(string $str): array
{
    // the array shift removes the dash I had as first element of the argv, your mileage may vary
    $serializedArguments = shell_exec(
        sprintf('php -r "array_shift(\$argv); echo serialize(\$argv);" -- %s', $str)
    );
    return unserialize($serializedArguments);
}

上面的代码会输出这样的东西

array(5) {
    [0] => string(6) "import"
    [1] => string(12) "Ling.Chronos"
    [2] => string(15) "efg=some things"
    [3] => string(10) "--sugar=no"
    [4] => string(2) "-d"
}