正则表达式匹配数字,但不匹配字母

时间:2013-05-02 19:40:15

标签: php regex preg-match

我有一个看起来像这样的字符串:

  

[if-abc] 12345 [if-def] 67890 [/ if] [/ if]

我有以下正则表达式:

/\[if-([a-z0-9-]*)\]([^\[if]*?)\[\/if\]/s

这就像我想要的那样匹配内部括号。但是,当我用文本(即abcdef)替换67890时,它与它不匹配。

  

[if-abc] 12345 [if-def] abcdef [/ if] [/ if]

我希望能够匹配任何字符,包括换行符,但另一个开头括号[if-除外。

3 个答案:

答案 0 :(得分:1)

这部分不像您认为的那样有效:

[^\[if]

这将匹配既不是[if的单个字符。无论组合如何。您可以使用negative lookahead来模仿所需的行为:

~\[if-([a-z0-9-]*)\]((?:(?!\[/?if).)*)\[/if\]~s

我还包括在前瞻中关闭标签,因为这样可以避免不合理的重复(这通常会降低性能)。另外,我已经更改了分隔符,因此您无需在模式中删除斜杠。

所以这是有趣的部分((?:(?!\[/?if).)*)解释:

(         # capture the contents of the tag-pair
  (?:     # start a non-capturing group (the ?: are just a performance
          # optimization). this group represents a single "allowed" character
    (?!   # negative lookahead - makes sure that the next character does not mark
          # the start of either [if or [/if (the negative lookahead will cause
          # the entire pattern to fail if its contents match)
      \[/?if
          # match [if or [/if
    )     # end of lookahead
    .     # consume/match any single character
  )*      # end of group - repeat 0 or more times
)         # end of capturing group

答案 1 :(得分:0)

稍微修改会导致:

/\[if-([a-z0-9-]+)\](.+?)(?=\[if)/s

[if-abc] 12345 [if-def] abcdef [/if][/if]

上运行它

第一场比赛的结果为:[if-abc] 12345

您的论坛有:abc12345

进一步修改:

/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s

匹配两个组。虽然分隔符[/if]未被其中任何一个捕获。

注意:当前面的文字与前瞻相匹配时,我在正则表达式中使用前瞻((?=))而不是匹配分隔符。

答案 2 :(得分:-1)

使用句点匹配任何字符。