使用 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"
}
我们知道可以使用预定义变量从命令行轻松获取参数数组$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"
}