Php 是否可以检查数学表达式字符串?

Php 是否可以检查数学表达式字符串?,php,regex,Php,Regex,我想检查所有括号的开始和结束是否正确,并检查它是否是数学表达式,是否在给定的字符串中 例: $str1=A1+A2*A3+A5+B3^B5*C1*A3/C2+B2+C1 $str2=A1+A2*A3+A5*C1+B3^B5*C1*A3/C2+B2+C1 $str3=A1+A2*A3+A5++B2+C1 $str4=A1+A2*A3+A5+B3^B5*C1*A3/C2+B2+C1 在上面的示例中,$str1和$str4是有效字符串 请帮助……使用正则表达式返回有多少个左括号和右括号 然后检查两个大

我想检查所有括号的开始和结束是否正确,并检查它是否是数学表达式,是否在给定的字符串中

例:

$str1=A1+A2*A3+A5+B3^B5*C1*A3/C2+B2+C1

$str2=A1+A2*A3+A5*C1+B3^B5*C1*A3/C2+B2+C1

$str3=A1+A2*A3+A5++B2+C1

$str4=A1+A2*A3+A5+B3^B5*C1*A3/C2+B2+C1

在上面的示例中,$str1和$str4是有效字符串


请帮助……

使用正则表达式返回有多少个左括号和右括号


然后检查两个大括号的数目……如果相等,则表达式是对的,否则是错的……

使用正则表达式返回有多少个左括号和右括号


然后检查两个大括号的数目……如果相等,则表达式是对的,否则是错的……

您需要一种解析器。我认为不能用正则表达式来处理这个问题,因为必须检查括号和可能的嵌套括号的数量和顺序。下面这个类是我找到的一个快速PHP端口:


您需要一种解析器。我认为不能用正则表达式来处理这个问题,因为必须检查括号和可能的嵌套括号的数量和顺序。下面这个类是我找到的一个快速PHP端口:


好吧,我想你要找的东西大概是什么。它不能只使用正则表达式。至少没有简单或好的方法


这是因为您正在处理嵌套结构。在这里可以找到一些实现的想法,我想你正在寻找的东西是一些或更多。它不能只使用正则表达式。至少没有简单或好的方法



这是因为您正在处理嵌套结构。您可以在此处找到实现的一些想法

找到EOS库,然后使用转换的“false”返回,或者修改它以剪切并按您希望的方式失败?谢谢您的回复,但尚未收到。请详细解释…查找匹配的大括号是递归正则表达式的典型任务,有两个“方程式操作系统”都是用PHP编写的,而且体积相当小,它们可以将方程式解析为RPN,或者以静默方式失败并返回false,这样你就可以用树结构快速解析方程式,并让你知道它是否正确。或可以使用递归正则表达式。哪一个可能会让人困惑,除非您非常擅长使用it RegEx以^^开头。在旁注中,您可能希望检查括号,即“[]”,以及它们在表达式中是否有效。存在[对类似问题的回答][1]。希望能有帮助。并尝试使用[exprlib][2]。[1] :[2]:找到EOS库并使用转换的“false”返回,或者修改它以剪切并按您希望的方式失败?谢谢您的回复,但尚未收到。请详细解释…查找匹配的大括号是递归正则表达式的典型任务,有两个“方程式操作系统”都是用PHP编写的,而且体积相当小,它们可以将方程式解析为RPN,或者以静默方式失败并返回false,这样你就可以用树结构快速解析方程式,并让你知道它是否正确。或可以使用递归正则表达式。哪一个可能会让人困惑,除非您非常擅长使用it RegEx以^^开头。在旁注中,您可能希望检查括号,即“[]”,以及它们在表达式中是否有效。存在[对类似问题的回答][1]。希望能有帮助。并尝试使用[exprlib][2]。[1] :[2]:谢谢你的回复,但你能给我正则表达式吗…?-所以你坚持认为这是一个有效的表达?显然不是。注意:1使用常规表达式来检查括号的数量是非常愚蠢的。他有一个问题,没有答案。谢谢你的回答,但你能给我正则表达式吗…?-所以你坚持认为这是一个有效的表达?显然不是。注意:1使用常规表达式来检查括号的数量是非常愚蠢的。他有一个问题,而不是答案。你链接到一个被接受的答案的问题就是链接到另一个问题。你能不能不在SO海报上这样做?你链接到一个问题谁的答案是另一个问题的链接。对于SO海报,您是否可以不遵循这一点?PHP中的端口仅包含嵌套括号/等。它实际上无法验证字符串是否是真正的数学有效函数。原始Python代码不足以正确计算您要验证的任何输入字符串。@Jon yes它只包括问题的第一部分括号,如果您想测试完整的语法,您需要对表达式求值,但为此,您需要值。您需要等价于求值的值,但你不需要f值
或者,如果您找到一个RPN解析器的中缀,@chintu,正如Jon提到的,这只是检查括号是否正确。我环顾四周,发现了这个答案:这可能完全涵盖了你的问题。如果我们有一个表达式,如:12.0000-++*-*+23.0000-*34.000,它将不起作用。PHP中的端口仅包含嵌套括号/等。它实际上无法验证字符串是否是真正的数学有效函数。原始Python代码不足以正确计算您要验证的任何输入字符串。@Jon yes它只包括问题的第一部分括号,如果您想测试完整的语法,您需要对表达式求值,但为此,您需要值。您需要等价于求值的值,但如果您找到RPN解析器的中缀,则不需要它的值。@chintu正如Jon提到的,它只是检查括号是否正确。我环顾四周,发现了这个答案:这可能完全涵盖了你的问题。如果我们有一个类似于:12.0000-++*-*+23.0000-*34.0000的表达式,它将不起作用
class MathExpression {

    private static $parentheses_open = array('(', '{', '[');
    private static $parentheses_close = array(')', '}', ']');

    protected static function getParenthesesType( $c ) {
        if(in_array($c,MathExpression::$parentheses_open)) {
            return array_search($c, MathExpression::$parentheses_open);
        } elseif(in_array($c,MathExpression::$parentheses_close)) {
            return array_search($c, MathExpression::$parentheses_close);
        } else {
            return false;
        }
    }

    public static function validate( $expression ) {
        $size = strlen( $expression );
        $tmp = array();
        for ($i=0; $i<$size; $i++) {
            if(in_array($expression[$i],MathExpression::$parentheses_open)) {
                $tmp[] = $expression[$i];
            } elseif(in_array($expression[$i],MathExpression::$parentheses_close)) {
                if (count($tmp) == 0 ) {
                    return false;
                }
                if(MathExpression::getParenthesesType(array_pop($tmp)) 
                    != MathExpression::getParenthesesType($expression[$i])) {
                    return false;
                }
            }
        }
        if (count($tmp) == 0 ) {
            return true;
        } else {
            return false;
        }
    }
}

//Mathematical expressions to validate
$tests = array(
    '(A1+A2*A3)+A5+(B3^B5)*(C1*((A3/C2)+(B2+C1)))',
    '(A1+A2*A3)+A5)*C1+(B3^B5*(C1*((A3/C2)+(B2+C1)))',
    '(A1+A2*A3)+A5++(B2+C1)))',
    '(A1+A2*A3)+A5+(B3^B5)*(C1*(A3/C2)+(B2+C1))'
);

// running the tests...
foreach($tests as $test) {
    $isValid = MathExpression::validate( $test );
    echo 'test of: '. $test .'<br>';
    var_dump($isValid);
}