如何在PHP中验证方程字符串中的括号

Pin*_*uin 9 php string math validation

如果善于PHP的人可以建议如何在表达式中验证括号,我会徘徊:

    ( 5 * 3 [ 6 ) - 6]
Run Code Online (Sandbox Code Playgroud)

这是错误的表达.我需要一个功能来做到这一点.这是我到目前为止所尝试的:

<?php
function hasMatchedParenthesis($string) {

$counter1 = 0;
$counter2 = 0;

$length = strlen($string);

for ($i = 0;$i < $length; $i++) {
    $char = $string[$i];
    if( $char == '(' ) {
        $counter1 ++;
    } elseif( $char == ')' ) {
        $counter1 --;
    }

        for($j =0;$j < $length; $j++) {
            $char = $string[$j];
            if( $char == '[' ) {
                $counter2 ++;
        } elseif( $char == ']' ) {
                $counter2 --;
        }

        }


    if( $counter1 < 0 || $counter2 < 0) {
        return false;
    }

}

echo 'ok';;

}


hasMatchedParenthesis('[5] * 3 - ( 4 - 7 * [3-6])'); // this is ok!

hasMatchedParenthesis('( 5 * 3 [ 6 ) - 6]'); // this returns as TRUE, but it is not!

?>
Run Code Online (Sandbox Code Playgroud)

请帮助我解决'[6]'事情的验证!我不知道怎么做:(

Sho*_*hoe 10

我想到的第一个想法是使用堆栈.PHP提供了两个将数组视为堆栈的函数:array_pusharray_pop.我们可以使用它们来创建一个堆栈0(我们在一个开口内()和1(我们在一个内部[)并检查每个闭括号是否与我们插入的最后一个值匹配:

function hasMatchedParenthesis($string) {
    $len = strlen($string);
    $stack = array;
    for ($i = 0; $i < $len; $i++) {
        switch ($string[$i]) {
            case '(': array_push($stack, 0); break;
            case ')': 
                if (array_pop($stack) !== 0)
                    return false;
            break;
            case '[': array_push($stack, 1); break;
            case ']': 
                if (array_pop($stack) !== 1)
                    return false;
            break;
            default: break;
        }
    }
    return (empty($stack));
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以将此扩展到任何其他字符对,包括{}:

case '{': array_push($stack, 2); break;
case '}': 
    if (array_pop($stack) !== 2)
        return false;
break;
Run Code Online (Sandbox Code Playgroud)

  • 好方法.在弹出时我会把`(/ [`本身移到堆栈并检查`)/]`. (2认同)