【问题标题】:Regular expression doesn't work as expected: '/=(\w+\s*)+=/'正则表达式无法按预期工作:'/=(\w+\s*)+=/'
【发布时间】:2016-01-07 18:43:09
【问题描述】:

这就是我所拥有的:

<?php

preg_match_all('/=(\w+\s*)+=/', 'aaa =bbb ccc ddd eee= zzz', $match);
print_r($match);

它只匹配eee:

Array
(
    [0] => Array
        (
            [0] => =bbb ccc ddd eee=
        )

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

)

我需要它来匹配 bbb、ccc、ddd、eee,例如:

...
   [1] => Array
        (
            [0] => bbb
            [1] => ccc
            [2] => ddd
            [3] => eee
        )
...

问题出在哪里?

【问题讨论】:

标签: php regex pcre


【解决方案1】:

试试这个正则表达式:

(\w+)(?=[^=]*=[^=]*$)

解释:

(\w+)          # group all words
(?=            # only if right after can be found:
    [^=]*      # regardless of non '=' character
    =          # one '=' character
    [^=]*$     # non '=' character till the end makes sure the first words are eliminated... You can try remove it from regex101 to see what happens.
)

Regex live here.

希望对你有帮助。

【讨论】:

  • 你能解释一下吗?我有点迷茫 positive lookahead 将如何实际寻找第一个 =
  • 请注意打开= (example) 时无效。但这取决于 OP 是否需要验证。
【解决方案2】:

您的正则表达式以= 开头和结尾,因此唯一可能的匹配是:

=bbb ccc ddd eee=

【讨论】:

    【解决方案3】:

    这是预期的行为。重复时会覆盖组捕获。

    1 组,1 次捕获

    与其尝试在 1 次匹配尝试中获取它们,不如在每次尝试中匹配一个标记。使用\G 匹配the end of last match

    这样的事情应该可以工作:

    /(?(?=^)[^=]*+=(?=.*=)|\G\s+)([^\s=]+)/
    

    regex101 Demo


    正则表达式分解

    • (?(?=^) ... | ... ) IF 在字符串的开头
      • [^=]*+= 消费直到第一个 =
      • (?=.*=) 并检查是否还有关闭 =
    • 否则
      • \G\s+ 仅在最后一场比赛在这里结束时才匹配,消耗前面的空格
    • ([^\s=]+) 匹配 1 令牌,在第 1 组中捕获。

    如果您还对匹配多于 1 组标记感兴趣,则还需要匹配组之间的文本:

    /(?(?=^)[^=]*+=(?=.*=)|\G\s*+(?:=[^=]*+=(?=.*=))?)([^\s=]+)/
    

    regex101 Demo

    【讨论】:

      【解决方案4】:

      您可以将preg_replacepreg_split 一起使用,即:

      $string = "aaa =bbb ccc ddd eee= zzz";
      $matches = preg_split('/ /',  preg_replace('/^.*?=|=.*?$/', '', $string));
      print_r($matches);
      

      输出:

      Array
      (
          [0] => bbb
          [1] => ccc
          [2] => ddd
          [3] => eee
      )
      

      演示:

      http://ideone.com/pAmjbk

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多