这是我关于 stackoverflow 的第一个问题,所以请在这里与我交谈。另外,我不是以英语为母语的人。
(16.02.2022) 答案(https://regex101.com/r/4FRznK/1来自对答案的评论)。特别感谢 Casimir et Hippolyte 的帮助!我希望我能联系到你。
\[if \s+ (?<cond> [^]]* ) ]
(?<content> [^[]*+
(?: (?R) [^[]*
| \[ (?! /if] | else (?:if)? \b) [^[]*
)*+
)
(?<rest>
(?: \[elseif \s+ [^]]* ] \g<content> )*+
(?: \[else] \g<content> )?+
\[/if]
)
(15.02.2022)更新: 我摆弄了下面介绍的解决方案,并且已经走得更远了。似乎字符串长度有一个限制,以便在没有任何灾难性回溯的情况下轻松匹配。
我更新了我的 Regex101 以显示最近的进展。也许你们中的一个人对如何解决这个问题有一个想法。https://regex101.com/r/wYzA3e/4
旁注: 我确实有一个工作功能,但我的目标是在优化和可靠性方面找到更快的解决方案。我当前的功能(在我看来)需要很长时间才能完成任务,并且非常依赖 strpos 来让我到达那里。如果有使用 PHP 内部函数的更便宜(在性能方面)的解决方案,我实际上并不想使用第三方函数。因此,即使您建议我使用替代方法,也请善待并提供您明确表示这些含义的提示。谢谢!
(14.02.2022)原文: 我的正则表达式遇到以下困难:这是字符串(“true”和/或“false”实际上不在字符串中,但有助于简化):
**[if true]**
[if true]
[if false]
[else]
[/if]
*[elseif false]*
[if true]
[/if]
[else]
[/if]
**[elseif false]**
[/if]
**[if false]**
[if false]
[else]
*[/if]*
**[else]**
[if true]
[/if]
[/if]
我标记了想要的匹配(**) 和我得到的匹配 ( *)
在这种情况下,我只想匹配最外层的父 [if XXXX].([else]|[elseif XXX]|[/if]) 语句与其相应的结尾,可以是 [else]、[elseif XXX] 或[/如果]。现在我不关心内部 [if XXX],因为当父母为假时,我不需要检查它们。
运行我的正则表达式时:
/\[if (.*?)\](((?R)|.)*?)(\[\/if\]|\[else\]|\[elseif )/gs
它匹配父母 [if XXX] 和其中任何 [elseif XX]、[else]、[/if] 的不连贯组合。
作为组,我确实需要匹配 > 每 X [if XXX] > [if XXX] 和匹配的 [END] 以及 [END] 之间的内容。
由于我不完全理解递归,我很感激你的帮助。提前谢谢了!
您可以在这里尝试正则表达式(更新): https ://regex101.com/r/wYzA3e/4