用preg_split函数按空格分割字符串但不分割单引号内的内容

4

我正在尝试按空格拆分字符串,但不包括单引号内的空格。

这是我正在处理的字符串:

'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32

以下正则表达式模式可以成功匹配我想要分隔的空格:
/\x20(?=[^']*('[^']*'[^']*)*$)\g

我遇到的问题是我使用了专门针对JavaScript正则表达式的http://www.regexr.com/编写了这个字符串,但我需要在PHP中使用它。
这是我目前有的PHP代码,但它会抛出一个错误:
preg_split("/\x20(?=[^']*('[^']*'[^']*)*$)/g", "'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32");

错误:

preg_split(): Unknown modifier 'g'

如果我去掉 / 和 /g,就会出现以下错误:
preg_match_all(): Compilation failed: nothing to repeat at offset 0

我猜测 PHP 中的正则表达式由于某种原因没有匹配到任何值,因此无法拆分该字符串。能否有人帮忙说明如何正确地进行操作?
谢谢。
2个回答

6

从正则表达式中移除g(全局)修饰符。

preg_split("/\x20(?=[^']*('[^']*'[^']*)*$)/", "'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32");

演示效果

虽然你的正则表达式可以工作,但你可以使用下面的方法来忽略引号中的空格,这样会更容易些。

$results = preg_split("/'[^']*'(*SKIP)(*F)|\x20/", $str);
print_r($results);

解释:

这个想法是跳过单引号中的内容。我首先匹配引号,然后是除了'之外的任何字符,接着是一个单引号,然后让子模式失败,并使用(*SKIP)(*F)回溯控制动词强制正则表达式引擎不重试带有另一个替代方案的子字符串。

输出

Array
(
    [0] => 'physical memory %'=92%;99;100
    [1] => 'physical memory'=29.69GB;31.68;32;0;32
)

这太棒了,非常感谢您的解释和更好的解决方案。 - thestepafter

1

PCRE正则表达式没有全局修饰符

只需从您的正则表达式中删除/g修饰符。

$arr = preg_split("/\x20(?=[^']*('[^']*'[^']*)*$)/", 
             "'physical memory %'=92%;99;100 'physical memory'=29.69GB;31.68;32;0;32");

PCRE 的“Perl 兼容”部分就这样了。 - Mr. Llama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接