我有一个采用大型多维结构的文件,类似于json,但还不够接近,无法使用json库。
数据看起来像这样:
alpha {
beta {
charlie;
}
delta;
}
echo;
foxtrot {
golf;
hotel;
}我尝试构建的正则表达式(对于preg_match_all)应该与每个顶级父元素(由{}大括号分隔)匹配,这样我就可以递归匹配,构建一个表示数据的多维php数组。
我尝试的第一个正则表达式是/(?<=\{).*(?=\})/s,它贪婪地匹配大括号内的内容,但是这并不是很正确,因为当顶级中有多个兄弟时,匹配太贪婪了。示例如下:
使用正则表达式/(?<=\{).*(?=\})/s匹配如下所示:
匹配1:
beta {
charlie;
}
delta;
}
echo;
foxtrot {
golf;
hotel;相反,结果应该是: Match 1:
beta {
charlie;
}
delta;比赛2:
golf;
hotel;那么正则表达式向导,我在这里遗漏了什么函数,或者我需要用php来解决这个问题?非常欢迎任何提示:)
发布于 2012-07-13 18:12:47
当然,你可以用正则表达式做到这一点。
preg_match_all(
'/([^\s]+)\s*{((?:[^{}]*|(?R))*)}/',
$yourStuff,
$matches,
PREG_SET_ORDER
);这为我在匹配中提供了以下内容:
[1]=>
string(5) "alpha"
[2]=>
string(46) "
beta {
charlie;
}
delta;
"和
[1]=>
string(7) "foxtrot"
[2]=>
string(22) "
golf;
hotel;
"把它拆分一下。
([^\s]+) # non-whitespace (block name)
\s* # whitespace (between name and block)
{ # literal brace
( # begin capture
(?: # don't create another capture set
[^{}]* # everything not a brace
|(?R) # OR recurse
)* # none or more times
) # end capture
} # literal brace仅供参考,这在n层大括号上工作得很好。
发布于 2012-07-13 17:43:00
我认为你可以通过匹配[a-zA-Z0-9][:blank]+{和}来使用preg_split得到一些东西。您将能够通过遍历结果来构造数组。使用一个递归函数,当你匹配一个开始标签时,它会更深入一些,而在一个结束标签上,它会更高一些。
否则,最干净的解决方案就是实现ANTLR语法!
https://stackoverflow.com/questions/11467705
复制相似问题