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

时间:2016-01-19 04:16:10

标签: php argv

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

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

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

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

最简单的方法是:

"-a b -c d"

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

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

3 个答案:

答案 0 :(得分:2)

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

function getArgv ($string) {
    global $argv;
    preg_match_all ('/(?<=^|\s)([\'"]?)(.+?)(?<!\\\\)\1(?=$|\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"
)

答案 1 :(得分:0)

或者只是让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));

答案 2 :(得分:0)

基于@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"
}