【问题标题】:Space removed by preg_splitpreg_split 删除的空间
【发布时间】:2019-08-25 20:08:30
【问题描述】:

我想用一个点后跟一个空格来分割字符串。但是,preg_split 会删除匹配部分的空格。

如何保留空间?

preg_split('/(?<=[.])\s+/u', 'One. Two. Three.', null, PREG_SPLIT_NO_EMPTY);

// Result: ['One.', 'Two.', 'Three.']
// Expected: ['One. ', 'Two. ', 'Three.']

【问题讨论】:

  • 你可以使用explode功能
  • print_r(explode(' ',$string));
  • @RakeshJakhar 那也会删除空格,对吧?
  • @kerbholz - 不,因为它不存在于初始字符串中。我不明白为什么 preg_split 删除了空格,但保留了点。
  • @RakeshJakhar - “我怎样才能保留空间?” - explode() 将删除它并产生与 OP 当前代码相同的结果。

标签: php regex preg-split


【解决方案1】:

您可以将肯定的前瞻转换为匹配,然后使用\K 忘记匹配的内容。此外,要匹配一个或多个空格,请使用\s+

\.\s+\K

Regex demo

var_dump(preg_split('/\.\s+\K/', 'One. Two. Three.', null, PREG_SPLIT_NO_EMPTY));

结果

array(3) {
  [0]=>
  string(5) "One. "
  [1]=>
  string(5) "Two. "
  [2]=>
  string(6) "Three."
}

【讨论】:

  • 我打算采用这个解决方案,但 OP 在 cmets 中说可以有多个空间,如果有,他想将它们全部捕获。
  • @Nick 同意,我已经删除了第一个选项并转而使用\K
【解决方案2】:

您可以使用 preg_match_all 并匹配任何内容,然后是点和可选空格

preg_match_all("/(.*?\.\s*)/", 'One. Two. Three.',$m);

结果:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(5) "One. "
    [1]=>
    string(5) "Two. "
    [2]=>
    string(6) "Three."
  }
  [1]=>
  array(3) {
    [0]=>
    string(5) "One. "
    [1]=>
    string(5) "Two. "
    [2]=>
    string(6) "Three."
  }
}

https://3v4l.org/ZFV9t

【讨论】:

  • 如果您使用[^.]* 而不是.*?,正则表达式可能会更有效
  • @Nick 也许是。我在 3v4l 上尝试过,它实际上更慢。但这还不是全部真相。
  • Regex101 建议 .*? 使用 30 步,[^.]* 使用 18 步。 regex101.com/r/uCFCZU/1
  • 反正就是挑剔而已。这是解决 OPs 问题的最佳方法。
  • @Bacchus \s* 需要在正则表达式中改为\s+
【解决方案3】:

根据您的预期结果。

$string = 'One. Two. Three.';

$split = preg_split("/(\w+\W+)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
var_dump($split);

【讨论】:

  • 这个答案缺少教育解释。
猜你喜欢
  • 2013-09-13
  • 1970-01-01
  • 2012-09-25
  • 2020-11-19
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多