我今天正在玩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:请不要发表评论,如“不要打扰这样做”或“不要重新发明轮子”。这只是为了学习目的。
答案 0 :(得分:1)
答案 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选项)。