【问题标题】:PHP preg_split last char lost on each resultPHP preg_split last char 在每个结果中丢失
【发布时间】:2012-06-15 11:40:15
【问题描述】:

根据协议文档,我可以接收编码为字符串的参数数组,其中每个参数由空格隔开。参数中的空格用反斜杠转义。

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

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

这些将被编码在一个字符串中,如下所示:

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

编码不是主要问题,但我面临解码问题。

我尝试使用正则表达式拆分参数,它应该由不在反斜杠之后的空格进行拆分,所以这是我的代码:

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

它按预期拆分参数,但它也删除了每个参数的最后一个字符,所以这是 var_dump 的输出:

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

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

TIA,

【问题讨论】:

    标签: php regex preg-split


    【解决方案1】:

    只需使用negative lookbehind:

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

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

    See it in action.

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

    lookbehind 版本断言空格前没有反斜杠,但不匹配字符——一个重要的区别。

    【讨论】:

    • 非常感谢。这很好,但我更想知道为什么我自己的方法没有,因为我认为它实际上应该...... O_o
    • 感谢一百万的解释
    • 我检测到这个问题。当 $str 为 void 时,它返回一个数组,其中一个元素包含 0... 你知道为什么吗?无论如何,在应用正则表达式之前,我都会检查一个 void $str...
    • @Fran:这就是所有类似拆分的函数的工作方式。如果他们找不到任何可拆分的内容,他们会返回一个结果:原始字符串本身。由于原始字符串是空的(如果它不是字符串而是null,也会发生同样的情况),这就是你得到的。
    猜你喜欢
    • 2013-11-19
    • 2012-10-19
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多