【发布时间】:2013-02-05 18:46:59
【问题描述】:
在 PHP 中,我有以下字符串:
$text = "test 1
{blabla:database{test}}
{blabla:testing}
{option:first{A}.Value}{blabla}{option:second{B}.Value}
{option:third{C}.Value}{option:fourth{D}}
{option:fifth}
test 2
";
我需要从这个字符串中取出所有的 {option...}(这个字符串中总共 5 个)。有些有多个嵌套括号,有些则没有。有些在同一行,有些不在。
我已经找到了这个正则表达式:
(\{(?>[^{}]+|(?1))*\})
所以以下工作正常:
preg_match_all('/(\{(?>[^{}]+|(?1))*\})/imsx', $text, $matches);
不在大括号内的文本被过滤掉,但匹配项还包括我不需要的blabla-items。
有什么方法可以将此正则表达式更改为仅包含option-items?
【问题讨论】:
-
这听起来像是语法解析器的工作。我曾经遇到过一个相关的问题。我很好奇是否有人会做这项工作! :)
-
可以嵌套多少个大括号?
-
我几乎因为提出类似问题而被禁止。只是我似乎在观众面前运气不好。无论如何,我不是通过正则表达式,而是通过stack-based parentheses match 循环解决了它。只是作为一种选择。