正则表达式吐出额外的空数组

时间:2014-05-07 02:51:03

标签: php regex

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

2 个答案:

答案 0 :(得分:1)

更好的方法是拆分而不是匹配它。

(?=\s\S+:)

每个字符串都包含键值对,或者仅包含没有键的值

答案 1 :(得分:0)

试试这个

(\S+):\s*(.*?)(?=\S+:|$)|(.*?)(?=\S+:)