所以,我在这里有一些关于如何做到这一点的想法,并接受了一些代码建议;我有LaTeX文件与表单中的组件
{upper}{lower}
其中upper
可以是从纯文本到LaTeX的任何内容,包括它自己的嵌套{}和lower
可以是空白或大量的乳胶。期望的输出是一对PHP字符串$upper
和$lower
,它们只包含两个父括号的内容。
$upperlowerQ='some string'; // in format {upper}{lower}
$qparts=nestor($upperlowerQ);
$upper=$qparts[0];
$lower=$qparts[1];
function nestor($subject) {
$result = false;
preg_match_all('~[^{}]+|\{(?<nested>(?R)*)\}~', $subject, $matches);
foreach($matches['nested'] as $match) {
if ($match != "") {
$result[] = $match;
$nesty = nestor($match);
if ($nesty)
$result = array_merge($result,$nesty);
}
}
return $result;
}
此函数适用于我的大约95%的数据(这个上/下分割在循环中调用大约1,000次)但是它失败了几个。它失败的一个例子如下:
{Draw an example of a reciprocal graph in the form $y=\frac{a}{x}$}{
\begin{tikzpicture}
\begin{axis}[xmin=-8,xmax=8,ymin=-5,ymax=12,samples=50,grid=both,grid style={gray!30},xtick={-8,...,8},ytick={-5,...,12},axis x line = bottom,
axis y line = left, axis lines=middle]
\end{axis}
\end{tikzpicture}\par
%ans: smooth reciprocal function plotted.
}
给出:
$upper
为Draw an example of a reciprocal graph in the form $y=\frac{a}{x}$
(这是正确的)但$lower
为a
,这是上半部分的分子......任何想法都值得赞赏。总是$lower
错误...... $upper
似乎是正确的。
答案 0 :(得分:2)
对于任何未来的读者,@ Jonny5的上述回应都非常有效。 eval.in
从评论中添加
尝试使用正则表达式like this: {((?:[^}{]+|(?R))*)}
仅提取外部{
}
内的内容,并检查返回的 preg_match_all的matchcount 。
$upper = ""; $lower = "";
if(preg_match_all('/{((?:[^}{]+|(?R))*)}/', $str, $out) == 2) {
$upper=$out[1][0]; $lower=$out[1][1];
}