PHP preg_split最后一个char丢失在每个结果上

时间:2012-06-15 11:40:16

标签: php regex preg-split

在协议文档之后,我可以接收编码为字符串的参数数组,其中每个参数通过空格与其他参数分开。参数中的空格用反斜杠转义。

所以,假设我们在参数数组中有以下字符串:

array('Eli is beautiful', 'Fran is ugly', 'Oso is nice')

这些将只用一个字符串编码,如下所示:

Eli\ is\ beautiful Fran\ is\ ugly Oso\ is\ nice

编码不是主要问题,但我遇到解码问题。

我尝试使用正则表达式拆分参数,该表达式应该用不是反斜杠的空格分割,所以这是我的代码:

$params = preg_split('/[^\\\\]\s/', $str);

它按预期分割了params,但它也删除了每个的最后一个char,所以这是var_dump的输出:

array(3) {
  [0]=>
  string(15) "Eli is beautifu"
  [1]=>
  string(11) "Fran is ugl"
  [2]=>
  string(11) "Oso is nice"
}

有人知道如何解决这个问题吗?

TIA,

1 个答案:

答案 0 :(得分:4)

只需使用negative lookbehind

$params = preg_split('/(?<!\\\\) /', $str);

上面的正则表达式匹配每个没有反斜杠的空格,这正是你想要的。

See it in action

更新:您之前的正则表达式会占用字母,因为匹配空格前的字符(只要它不是反斜杠);因此,该字符被视为分隔符的一部分,并与空格一起从输出中删除。

lookbehind版本断言在空格之前没有反斜杠,但匹配角色 - 这是一个重要的区别。