我有这个文件 code.php ,它在命令行上用作交互式应用程序。代码部分就像这样
$f = fopen('php://stdin','w');
$input = fgets($f);
现在我想将此输入字符串转换为参数数组。我正在界定 Space Character 的论点。例如:
$arguments = explode(' ', $input);
它适用于大多数情况,但我想再插入一个字符串,其中字符串本身具有 space 。例如:
$input // "a var" and a 123
此代码应分为四个元素而不是五个元素的数组。我相信它可以用正则表达式。但是在PHP中还有其他更简单,更快捷的选择。
如果没有,请帮助解决最优化的正则表达式。
答案 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.com和a 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);
?>