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

标签 php regex

所以,我在这里得到了一些关于如何做到这一点的想法,并采纳了一些代码建议;我有带有以下形式组件的 LaTeX 文件 {upper}{lower},其中 upper 可以是从纯文本到 LaTeX 的任何内容,包括其自己的嵌套 {},lower 可以是空白或实质内容 latex 。所需的输出是一对 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 as 以 $y=\frac{a}{x}$ 的形式绘制倒数图示例(这是正确的),但 $lower a,它是上面部分分数的分子...任何想法都值得赞赏。 $lower 总是错误的...$upper 似乎是正确的。

最佳答案

对于任何 future 的读者来说,@Jonny5 的上述回应非常有效。 eval.in


从评论中添加

尝试使用正则表达式like this: {((?:[^}{]+|(?R))*)} 仅提取外部 { } 内部的内容并检查 preg_match_all 返回的 matchcount 是否正好有 2 个项目匹配.

$upper = ""; $lower = "";

if(preg_match_all('/{((?:[^}{]+|(?R))*)}/', $str, $out) == 2) {
  $upper=$out[1][0]; $lower=$out[1][1];
}

参见test at eval.in

关于php - 从嵌套大括号中提取代码,包括 PHP 中的多个内部大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023645/

相关文章:

javascript - Json.Parse 转义换行符

php - yii2 Webhook 帖子为空

php - 我的 MySQL 查询有什么问题?

php - 通过单个操作输入多个表

php - 在使用临时文件夹上传之前调整多个图像大小

php - 更新数据时获取特定行

Python 正则表达式检查字符串是否包含任何单词

regex - 重写条件不起作用

php - 提取英国邮政编码首字母的正则表达式

visual-studio - 在 Visual Studio 编辑器中的文件中进行正则表达式搜索