使用PHP从字符串中获取$argv
我们知道,可以使用预定义变量使用PHP从字符串中获取$argv,php,argv,Php,Argv,我们知道,可以使用预定义变量$argv从命令行轻松获取参数数组 有没有什么简单的方法可以从字符串而不是命令行获取数组? 我需要为相关库编写一些测试 例如,当您在script.php中运行script.php-ab-cd时, 您可以使用值[“script.php”、“-a”、“b”、“-c”、“d”] 所以这里我的问题是,在php脚本中, 如何从字符串(比如“-ab-cd”)中获取此数组,而不是将字符串传递给命令行,而是传递给变量 我不需要在这里解析选项 最简单的方法是: $array = pre
$argv
从命令行轻松获取参数数组
有没有什么简单的方法可以从字符串而不是命令行获取数组?我需要为相关库编写一些测试 例如,当您在
script.php
中运行script.php-ab-cd
时,您可以使用值
[“script.php”、“-a”、“b”、“-c”、“d”]
所以这里我的问题是,在php脚本中,
如何从字符串(比如
“-ab-cd”
)中获取此数组,而不是将字符串传递给命令行,而是传递给变量
我不需要在这里解析选项
最简单的方法是:
$array = preg_split ("/\s+/", $str);
但是,这不能覆盖选项值内带有空格的字符串。说:
好的,没有人回答这个问题,我会在这里提出一个解决方案:
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);
好的,没有人回答这个问题,我会在这里提出一个解决方案:
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);
或者让PHP来完成这项工作:
$arguments='-ab-cd--efg=“asd lol”;
$serializedArguments=shell\u exec(
sprintf(“%s-r”echo序列化(\\$argv);“--%s”,PHP\u二进制,$arguments)
);
var_dump(未序列化($darguments));
或者让PHP来完成这项工作:
$arguments='-ab-cd--efg=“asd lol”;
$serializedArguments=shell\u exec(
sprintf(“%s-r”echo序列化(\\$argv);“--%s”,PHP\u二进制,$arguments)
);
var_dump(未序列化($darguments));
根据@Slam的回答(我不相信regex适用于那种工作),以下是我的结论:
/**
* 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"
}
根据@Slam的回答(我不相信regex适用于这种工作),以下是我的结论:
/**
* 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"
}
“从字符串获取数组”是什么意思?@RobbieAverill例如,当您运行
script.php-ab-cd
,在script.php
中,您可以使用[“script.php”、“-a”、“b”、“-c”、“d”]值获取$argv
。所以这里我的问题是,在php脚本中,如何从字符串中获取这个数组,比如说“-ab-cd”
。如果您正在寻找一个通用的解决方案,我建议您使用第三方库,如witch,您可以或多或少地传入字符串,然后使用一个漂亮的API访问您的值。@Michael,这不是我想要的,请看答案。@PanwenWang我理解您的问题。使用我建议的库,您可以将explode(“,$yourString)
像new命令(explode(“,$yourString))一样输入构造函数
然后您可以使用该类读取命令、标志及其值。您所说的“从字符串获取数组”是什么意思?@RobbieAverill例如,当您运行script.php-a b-cd
时,在script.php
中,您可以获得$argv
值[“script.php”,“a”,“b”,“-c”,“d”]
。所以这里我的问题是,在php脚本中,如何从字符串中获取这个数组,比如说“-ab-cd”
。如果您正在寻找一个通用的解决方案,我建议您使用第三方库,如witch,您可以或多或少地传入字符串,然后使用一个漂亮的API访问您的值。@Michael,这不是我想要的,请看答案。@PanwenWang我理解您的问题。使用我建议的库,您可以将explode(“,$yourString)
像new命令(explode(“,$yourString))一样输入构造函数
然后可以使用该类读取命令、标志及其值。