首页 > 解决方案 > PHP中的匹配括号

问题描述

我想使用 php 查找括号字符串是否匹配。所以我写了这个。

<?php  

function Parenthesis($string) {
$ok = preg_match('~(\((?1)*+\)|\[(?1)*+]|{(?1)*+})*\z~A', $string);
if ($ok==1) {
    return "true"; 
} else {
    return "false";
}
}

$entree = "{([]){}()}";
$sortie = Parenthesis($entree);
echo "Réponse : ".$sortie;

它给了true.

但是当我通过$entree = "{C{}[{[a]}RqhL]{y2}}";它时,它给出了错误,同时我需要真实。我该如何修改代码。

标签: phpregex

解决方案


通过一次解析一个字符并维护一堆左括号,这可能更容易(也更可靠)完成。当看到右括号时,堆栈的顶部(最后看到的左括号)被弹出以验证它是否与右括号匹配。如果堆栈为空,或者括号不匹配,我们返回 false。解析完所有字符后,堆栈为空表示匹配。

function Parenthesis($string) {
    $opening = array('}' => '{', ']' => '[', ')' => '(');
    $parens = array();
    foreach (str_split($string) as $char) {
        switch ($char) {
            case '{':
            case '[':
            case '(':
                $parens[] = $char;
                break;
            case '}':
            case ']':
            case ')':
                if (!count($parens) || array_pop($parens) != $opening[$char]) return false;
                break;
            default:
                break;
        }
    }
    return count($parens) === 0;
}

function check_balanced($string) {
    echo "$string is " . (Parenthesis($string) ? '' : 'not ') . "balanced\n";
}

check_balanced("{([]){}()}");
check_balanced("{C{}[{[a]}RqhL]{y2}}");
check_balanced("{([]){]()}");

输出:

{([]){}()} is balanced
{C{}[{[a]}RqhL]{y2}} is balanced
{([]){]()} is not balanced

3v4l.org 上的演示


推荐阅读