PHP preg_match_all捕获字符串前面的所有模式而不是中间字符串

时间:2014-11-18 16:07:46

标签: php regex

给出主题

AB: CD:DEF: HIJ99:message packet - no capture

我制作了以下正则表达式来正确捕获2-5个字符的目标,后面跟着一个冒号。

/\s{0,1}([0-9a-zA-Z]{2,5}):\s{0,1}/

即使在目标

之前或之后添加了错误空格,也会返回我的匹配项
[0] => AB
[1] => CD
[2] => DEF
[3] => HIJ99

但是,如果消息包在任何地方都包含冒号,例如

AB: CD:DEF: HIJ99:message packet no capture **or: this either**

当然在结果集中包含[4] => or,这是不可取的。我想从一开始就将匹配限制为一个连续的集合,然后一旦我们失去并发性,停止在余数中寻找更多的匹配

编辑1: 还尝试^(\s{0,1}([0-9a-zA-Z]{2,5}):\s{0,1}){1,5}强制从字符串的开头检查多个匹配,但后来我丢失了单独的匹配

[0] => Array
    (
        [0] => AB: CD:DEF: HIJ99:
    )

[1] => Array
    (
        [0] => HIJ99:
    )

[2] => Array
    (
        [0] => HIJ99
    )

编辑2: 请记住,主题不是固定的。

AB: CD:DEF: HIJ99:message packet - no capture

可以很容易

ZY:xw:VU:message packet no capture or: this either

我们试图拉动的比赛,主题也是可变的。只是想过滤掉匹配"的概率:"在消息包中

2 个答案:

答案 0 :(得分:1)

怎么样:

$str = 'AB: CD:DEF: HIJ99:message packet no capture or: this either';
preg_match_all('/(?<![^:]{7})([0-9a-zA-Z]{2,5}):/', $str, $m);
print_r($m);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => AB:
            [1] => CD:
            [2] => DEF:
            [3] => HIJ99:
        )

    [1] => Array
        (
            [0] => AB
            [1] => CD
            [2] => DEF
            [3] => HIJ99
        )

)

答案 1 :(得分:1)

您可以使用\G进行连续字符串匹配。

$str = 'AB: CD:DEF: HIJ99:message packet no capture or: this either';
preg_match_all('/\G\s*([0-9a-zA-Z]{2,5}):\s*/', $str, $m);
print_r($m[1]);

输出:

Array
(
    [0] => AB
    [1] => CD
    [2] => DEF
    [3] => HIJ99
)

DEMO