如何用特定字符前面没有的空格拆分字符串?

How can I split a string by white spaces that are not precedent by a certain character?

我只想在白色 spaces 处拆分一个字符串,它前面没有特定的分隔符(在我的例子中是:)。例如:

$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);

但是每次出现白色时它仍然会分裂 space。

编辑:我想我问错了问题,但是 "whatever this is" 应该保留为单个字符串

编辑 2:冒号前的位是已知的并保持不变,也许以某种方式合并这些会使任务更容易(不在应该保持在一起的字符串中以白色 space 字符拆分)?

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

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

RegEx Demo

正则表达式 \h+(?=[A-Z][a-z]*: ) 匹配 1+ 个白色 space 后跟以大写字母和冒号开头的单词和 space.

你可以的

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

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

dd($split);

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

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

Regex demo | php demo