从嵌套的花括号中提取代码,包括PHP中的多个内部花括号

时间:2015-08-15 10:04:40

标签: php regex

所以,我在这里有一些关于如何做到这一点的想法,并接受了一些代码建议;我有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.
}

给出: $upperDraw an example of a reciprocal graph in the form $y=\frac{a}{x}$(这是正确的)但$lowera,这是上半部分的分子......任何想法都值得赞赏。总是$lower错误...... $upper似乎是正确的。

1 个答案:

答案 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];
}

请参阅test at eval.in