正则表达式检测嵌套区域

时间:2011-05-18 09:07:29

标签: regex

鉴于此文:

[start block1]
[end block1]
lorem
[start block2]
ipsum
[start block2_1]
[end block2_1]
dolor
[end block2]

正则表达式是否可以匹配block1& block2没有block2_1。

当然,我们不能依赖于块的名称,而只能依赖于他嵌套在另一个块中的事实。

1 个答案:

答案 0 :(得分:3)

试试这个:

\[start (\w+)\].*?\[end \1\]

只要您不重复任何块名称,您应该没问题。 \1将匹配您已启动的块的名称,并捕获内部的任何内容。如果您的风格不支持它(如JavaScript),请确保使用全点选项(或单行),/s[\s\S]*黑客。

在PHP中,使用以下代码:

preg_match_all('/\[start (\w+)\].*?\[end \1\]/s', $str, $matches);

然后您可以轻松获取名称:

$area_names = $matches[1];

工作示例:http://ideone.com/OsbSt