我有一个看起来像这样的字符串:
[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-
。
我有一个看起来像这样的字符串:
[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-
。
这部分不像你想象的那样工作:
[^\[if]
这将匹配既不是[
,i
或的单个字符f
。不管组合。不过,您可以使用负前瞻来模仿所需的行为:
~\[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
稍作修改会导致:
/\[if-([a-z0-9-]+)\](.+?)(?=\[if)/s
运行它[if-abc] 12345 [if-def] abcdef [/if][/if]
第一场比赛的结果为:[if-abc] 12345
您的组是:abc
和12345
并进一步修改:
/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s
匹配两组。尽管[/if]
这些中的任何一个都没有捕获分隔符。
注意:当前面的文本与前瞻匹配时,我在正则表达式中使用前瞻 ( (?=)
) 来停止匹配分隔符,而不是匹配分隔符。
使用句点匹配任何字符。