命令行输入到PHP数组

时间:2016-08-28 07:13:03

标签: php regex string

我有这个文件 code.php ,它在命令行上用作交互式应用程序。代码部分就像这样

$f = fopen('php://stdin','w');
$input = fgets($f);

现在我想将此输入字符串转换为参数数组。我正在界定 Space Character 的论点。例如:

$arguments = explode(' ', $input);

它适用于大多数情况,但我想再插入一个字符串,其中字符串本身具有 space 。例如:

$input // "a var" and a 123

此代码应分为四个元素而不是五个元素的数组。我相信它可以用正则表达式。但是在PHP中还有其他更简单,更快捷的选择。

如果没有,请帮助解决最优化的正则表达式

1 个答案:

答案 0 :(得分:1)

可以使用(*SKIP)(*FAIL)轻松完成:

<?php

$string = 'argument1 argument2 "argument3 with spaces" argument4';
$regex = '~"[^"]*"(*SKIP)(*FAIL)|\ ~';

$arguments = preg_split($regex, $string);
print_r($arguments);
?>

另外,请参阅a demo on ideone.coma demo on regex101.com

<小时/> 线索是匹配双引号之间的所有内容,然后强制引擎抛出比赛。然后|之后的交替成功匹配。显然,这可以扩展为单引号和花括号 要甚至允许转义引号,您可以使用外观调整表达式:

(?<!\\)".*?(?<!\\)"(*SKIP)(*FAIL)|\ 

PHP中,您还需要转义它们,因此代码变为:

<?php

$string = 'argument1 argument2 "argument3 with spaces" argument4 "argument5 with \"escaped quotes\""';
$regex = '~(?<!\\\\)".*?(?<!\\\\)"(*SKIP)(*FAIL)|\ ~';

$arguments = preg_split($regex, $string);
print_r($arguments);
?>