【问题标题】:How can I split a string by white spaces that are not precedent by a certain character?如何用某个字符之前没有的空格分割字符串?
【发布时间】:2019-09-09 02:47:47
【问题描述】:

我只想在前面没有特定分隔符(在我的情况下为:)的空格处拆分字符串。例如:

$string = "Time: 10:40 Request: page.php Action: whatever this is Refer: Facebook";

然后从这样的事情我想实现一个数组,这样:

$array = ["Time: 10:40", "Request: page.php", "Action: whatever this is", "Refer: Facebook"];

到目前为止,我已经尝试了以下方法:

$split = preg_split('/(:){0}\s/', $visit);

但这仍然会在每次出现空白时分裂。

编辑:我想我问错了问题,但是“不管这是什么”应该保留为单个字符串

编辑 2:冒号之前的位是已知的并且保持不变,也许将这些位合并起来会使任务更容易(而不是在应该保持在一起的字符串中的空白字符处拆分)?

【问题讨论】:

  • 我的问题措辞错误是不好的,而如果没有其他空格,您的解决方案效果很好,我的一些应该保持在一起的字符串有额外的空格,所以像“不管这个is" 应保留为单个字符串。

标签: php regex preg-split


【解决方案1】:

您可以在拆分正则表达式中使用前瞻:

/\h+(?=[A-Z][a-z]*: )/

RegEx Demo

Regex \h+(?=[A-Z][a-z]*: ) 匹配 1+ 个空格,后跟一个以大写字母开头的单词和一个冒号和空格。

【讨论】:

  • whatever this is 应保留为单个字符串,
  • 谢谢!是否可以对其进行修改,以便将冒号之前的某些位解释为两位大写字符串?诸如“AT”、“AB”之类的东西没有正确拆分:“Action: This Example BB: Bla bla Request: 555”。否则惊人的答案,谢谢!
  • @peterxz:试试看:/\h+(?=[A-Z]+[a-z]*: )/
【解决方案2】:

你可以的

$string = "Time: 10:40 Request: page.php Action: whatever this is Refer: Facebook";

$split = preg_split('/\h+(?=[A-Z][a-z]*:)/', $string);

dd($split);

【讨论】:

    【解决方案3】:

    另一种选择可能是匹配冒号之前的内容,然后匹配以空格、非空白字符和冒号开头的下一部分:

    \S+:\h+.*?(?=\h+\S+:)\K\h+
    
    • \S+: 匹配 1+ 次非空白字符
    • \h+ 匹配 1+ 次水平空白字符
    • .*? 匹配除换行符以外的任何字符,非贪心
    • (?=\h+\S+:) 正向前瞻,断言右边是 1+ 个水平空白字符、1+ 个非空白字符和一个冒号
    • \K\h+ 忘记使用 \K 匹配的内容并匹配 1+ 个水平空白字符

    Regex demo | php demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2012-02-14
      • 2020-05-16
      • 2012-09-22
      • 2012-04-22
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多