如何用不是以某个字符开头的空格来分隔字符串?

时间:2019-04-18 18:03:30

标签: php regex preg-split

我只想在没有特定定界符(在我的情况下为:)的空白处分割字符串。例如:

$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:冒号之前的位已知并保持不变,也许以某种方式合并这些位使任务变得更容易(不分割应留在一起的字符串中的空白字符)?

3 个答案:

答案 0 :(得分:2)

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

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

RegEx Demo

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

答案 1 :(得分:1)

你可以做到

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

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

dd($split);

答案 2 :(得分:0)

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

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

Regex demo | php demo