我们知道可以从命令行轻松获取带有预定义变量$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);
答案 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"
}