【问题标题】:PHP - latex format of function with regexPHP - 带有正则表达式的函数的乳胶格式
【发布时间】:2015-10-16 15:16:14
【问题描述】:

是否可以编写一个正则表达式来接受'sqrt(2 * (2+2)) + sin(pi/6)' 之类的输入并将其转换为'\sqrt{2 \cdot (2+2)} + \sin(\pi/6)'

问题在于其中的“sqrt”和括号。很明显我不能简单地使用这样的东西:

/sqrt\((.?)\)/ -> \\sqrt{$1}

因为这段代码会创建类似 '\sqrt{2 \cdot (2+2)) + \sin(\pi/6}' 的内容。

【问题讨论】:

  • 您有多少个嵌套级别?有sqrt(2 * (2+(4-2))) + sin(pi/6)这样的表达方式吗?
  • 我想要无限数量的嵌套括号,函数也可以嵌套。但最后我找到了一个可行的解决方案!

标签: php regex latex parentheses


【解决方案1】:

一般来说,no regular expression can effectively handle nested parentheses。很抱歉成为坏消息的承担者! MathJAX 解析器库可以解释 LaTeX 方程,您可以添加自定义输出例程来执行您想要的操作。

TeX 问题也可以试试http://tex.stackexchange.com

【讨论】:

  • 谢谢,我在我的项目中使用 MathJax,但我不相信它可以完成这项工作(至少我无法想象如何),因为它必须以某种方式解决我的问题问一下。有没有其他选项如何在 PHP 中执行此操作?
【解决方案2】:

前段时间我以这种方式解决了类似的问题。或许对你有帮助

$str = 'sqrt((2 * (2+2)) + sin(pi/(6+7)))';
$from = [];     // parentheses content
$to = [];       // patterns for replace #<number> 
$brackets = [['(', ')'], ['{', '}'], ['[', ']']]; // new parentheses for every level
$level = 0;
$count = 1;  // count or replace made
while($count) {
  $str = preg_replace_callback('(\(([^()]+)\))', 
           function ($m) use (&$to, &$from, $brackets, $level) {
             array_unshift($to, $brackets[$level][0] . $m[1] . $brackets[$level][1]);
             $i = '#' . (count($to)-1); // pattern for future replace. 
                                        // here it '#1', '#2'. 
                                        // Make it so they will be unique
             array_unshift($from, $i); 
             return $i; }, $str, -1, $count); 
  $level++;
  }

echo str_replace($from, $to, $str); // return content back
// sqrt[{2 * (2+2)} + sin{pi/(6+7)}]

我忘记了所有细节,但它似乎有效

【讨论】:

    【解决方案3】:

    我的解决方案:它只是将转换为 char 数组的字符串抛出并测试当前子字符串是否以 $latex 开头,如果它确实第二个 for-cycle 从这一点朝不同的方向移动,并通过括号决定函数的开始位置并结束。 (startsWith函数)

    代码:

    public static function formatFunction($function, $latex, $input) {
        $input = preg_replace("/" . $function . "\(/", $latex . "{", $input);
        $arr = str_split($input);
    
        $inGap = false;
        $gap = 0;
    
        for ($i = count($arr) - 1; $i >= 0; $i--) {
            if (startsWith(substr($input, $i), $latex)) {
                for ($x = $i; $x < count($arr); $x++) {
                    if ($arr[$x] == "(" || $arr[$x] == "{") { $gap++; $inGap = true; } 
                    else if ($arr[$x] == ")" || $arr[$x] == "}") {  $gap--; }
    
                    if ($inGap && $gap == 0) {
                        $arr[$x] = "}";
                        $inGap = false;
                        break;
                    }
                }
            }
            $gap = 0;
        }
    
        return implode($arr);
    }
    

    用途:

    self::formatFunction("sqrt", "\\sqrt", 
    "sqrt(25 + sqrt(16 - sqrt(49)) + (7 + 1)) + sin(pi/2)");
    

    输出:

    \sqrt{25+\sqrt{16-\sqrt{49}}+(7+1)}+\sin (\pi/2)
    

    注意:sinpi 不是由这段代码格式化的,它只是 str_replace 函数...

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多