正则表达式:在匹配的括号之间选择:模板引擎

时间:2014-09-05 08:51:00

标签: php regex brackets

我今天正在玩PHP创建一种小语言(只是为了好玩),但我遇到了一个问题:

如何在匹配的括号中进行选择?

我的模板字符串:

for(items as item){ // this bracket
  if(some_condition){
      // do stuff

  } // my regex stops here


} // and this bracket

我使用this regex [\w]+\([ \w]+\){([\s\n\r\t/\w(){}]+?)},但在找到第一个封闭括号时停止。

如何让它选择匹配括号之间的所有内容?:

for(items as item){// this bracket

if(some_condition){
      // do stuff

  } // my regex stops here

} //和这个括号

然后我将分别编译for中的内容。

PS:请不要发表评论,如“不要打扰这样做”或“不要重新发明轮子”。这只是为了学习目的。

2 个答案:

答案 0 :(得分:1)

你可以试试下面的正则表达式,它允许匹配另一个}括号。

[\w]+\([ \w]+\){([\s\n\r\t\/\w(){}]+?}[\s\n\r\t\/\w(){}]+?)}

DEMO

答案 1 :(得分:1)

您可以使用recursion

$code = '
for(items as item) {
    if(some_condition) {
        while stuff {
            hi
        }
    }
    done
}
';

$re = '/{ ( ( [^{}] | (?R) ) * ) }/x';

preg_match_all($re, $code, $m);
print_r($m[1][0]);

打印

if(some_condition) {
    while stuff {
        hi
    }
}
done

即已正确检测到内部块。

也就是说,正则表达式是解析正式语言的错误工具(但它们适用于标记化)。例如,一旦添加包含" {":

的字符串文字,上面的内容就会无可救药地破坏
for(items as item){
    echo "hi there :{ ";
}

你真正需要的是一个解析器,可以手动制作(良好的学习练习!)或生成(参见here选项)。

相关问题