$input = "some words go here priority: p1,p2 -rank:3 status: not delayed";
$pattern = "/(\S+):\s*(.*?)(?=\S+:|$)|(.*?)(?=\S+:|$)/";
preg_match_all($pattern, $input, $matches);
示例:http://regex101.com/r/yM0wO1#pcre
上述模式最终在最后输出一个额外的空数组。 (参见示例中的匹配5)
其他一切都是我期望的......
如何防止额外的空数组?
编辑: 背景信息
我的数据格式如下:
some words go here priority: p1,p2 -rank:3 status: not delayed
基本上我需要检索与冒号名称对应的每组数据。
理想情况下,如果我最终得到一个数组结构
'' => 'some words go here'
priority => 'p1,p2'
-rank => 3
status => 'not delayed'
一些警告:
keywords will not have a defining colon-word (keywords are just placed in the front)
keywords will not always exist (might just be colon-words)
colon-words will not always exist (might just be keywords)
答案 0 :(得分:1)
更好的方法是拆分而不是匹配它。
(?=\s\S+:)
每个字符串都包含键值对,或者仅包含没有键的值
答案 1 :(得分:0)
试试这个
(\S+):\s*(.*?)(?=\S+:|$)|(.*?)(?=\S+:)