preg_match_all 只匹配一个

preg_match_all is only matching one

我正在尝试获取点后的值,我想获取所有的值(每个都作为它们自己的 key/value)。

下面是我运行:

$string = "div.cat.dog#mouse";
preg_match_all("/\.(.+?)(\.|#|$)/", $string, $matches);

当我转储 $matches 时,我得到了这个:

Array
(
    [0] => Array
        (
            [0] => .cat.
        )

    [1] => Array
        (
            [0] => cat
        )

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

)

项目 [1] 所在的位置只有 returning 1 个值。我所期待的是 return(对于这种情况)2 项 catdog。为什么 dog 没有被 preg_match_all 选中?

使用前瞻:

\.(.+?)(?=\.|#|$)

RegEx Demo

您的正则表达式中的问题是您正在匹配 LHS 上的 DOT 和匹配的 RHS 上的 DOT 或 HASH 或输入结尾。匹配后,内部指针向前移动,不留下要匹配下一个单词的 DOT。

(?=\.|#|$) 是一个积极的前瞻,它不匹配这些字符,但只是向前看,因此指针保留在 cat 而不是 cat. 之后的 DOT。