我有一个看起来像这样的字符串:
[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-
除外。
答案 0 :(得分:1)
这部分不像您认为的那样有效:
[^\[if]
这将匹配既不是[
,i
或f
的单个字符。无论组合如何。您可以使用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
您的论坛有:abc
和12345
进一步修改:
/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s
匹配两个组。虽然分隔符[/if]
未被其中任何一个捕获。
注意:当前面的文字与前瞻相匹配时,我在正则表达式中使用前瞻((?=)
)而不是匹配分隔符。
答案 2 :(得分:-1)
使用句点匹配任何字符。