【问题标题】:preg_match_all is only matching onepreg_match_all 只匹配一个
【发布时间】:2015-03-14 06:00:05
【问题描述】:

我正在尝试获取点之后的值,并且我想获取所有这些点(每个作为它们自己的键/值)。

以下是我正在运行的:

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

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

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

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

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

)

item [1] 在哪里,它只返回 1 个值。我所期待的是它返回(对于这种情况)2 个项目 catdog。为什么dog 没有被preg_match_all 接听?

【问题讨论】:

  • 因为dog之前的点已经匹配了..使用lookarounds来执行这种情况。

标签: php regex preg-match-all


【解决方案1】:

使用前瞻:

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

RegEx Demo

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

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

【讨论】:

  • 也许您可以多解释一下?= 的作用!否则它会很快回答
  • 前瞻能走多远?只有一个?
  • 我还需要对 # 进行前瞻,还是对所有 3 个进行前瞻?
  • 前瞻可以是任何长度的模式。而(?=\.|#|$) 已经在期待#
  • 这是一个模式匹配前瞻 - 从 (?= 到结束 ) 的任何内容都匹配。
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多