Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从字符串中获取$argv_Php_Argv - Fatal编程技术网

使用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))一样输入构造函数
然后可以使用该类读取命令、标志及其值。