bbs.thinkzhu.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4103|回复: 1
打印 上一主题 下一主题

判断字符串中的括号是否匹配

[复制链接]

170

主题

267

帖子

1543

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1543
跳转到指定楼层
楼主
发表于 2014-4-24 11:27:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

用PHP写一个函数判断字符串中”{“与”}”是否匹配, 提示:”{“与”}”必须同时出现,”{“必须在”}”前面,允许嵌套。



170

主题

267

帖子

1543

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1543
沙发
 楼主| 发表于 2014-4-24 11:28:22 | 只看该作者
风兮蜻蜒最早提交,iat随后在其基础上做了完善,这个堆栈的思想用的完美呀,青菜虫也是用堆栈评论的解决了这个问题!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$wrong = '{a{b{cd}ef{}g}}h}';
$right = '{a{b{cd}ef{}g}}h';
$wrong_2 = '{a{b{cd}ef{}g}}h{';
$wrong_3 = '{';
function match($str) {
    $len = strlen($str);
    $stack = array();
    for ($i = 0; $i < $len; $i++) {
        if ($str[$i] == '{') {
            // 如果是左括号, 保存
            array_push($stack, '{');
        } else if ($str[$i] == '}') {
            // 如果是右括号, 看上一个保存的是不是左
            $pop = array_pop($stack);
            // 如果上一个不是左, 那失败
            if ($pop != '{') {
                return false;
            }
        }

    }
    if (empty($stack)) return true;
    return false;
}

var_dump(match($wrong));
var_dump(match($right));
var_dump(match($wrong_2));
var_dump(match($wrong_3));

TNT的正则很强大,几句话就搞定了!
1
2
3
4
5
6
7
$check_str = pregStr($string);
echo preg_match('/[}{]/',$check_str)?'字串中有{与}不匹配的情况!':'字串中{与}完全匹配!';
//迭归替换匹配{}
function pregStr($string){
    $string = preg_match('/{[^}{]*?}/',$string)?preg_replace('/{([^}{]*?)}/','<$1>',$string)string;
    return preg_match('/{[^}{]*?}/',$string)?pregStr($string)string;
}

别有儿的解法扩展了括号,还能查找各种2个字符的匹配,强大!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function kuoHao($str, $F1 = '{', $F2 = '}') {
    if (strpos($str, $F1) === false && strpos($str, $F1) === false) {
        return '无括号';
    }

    if (substr_count($str, $F1) !== substr_count($str, $F2)) {
        return '括号不对哦!!';
    }
    $pos = 0;
    $stack = array();

    while (($pos = strpos($str, $F1, $pos)) !== false) {
        array_push($stack, $pos);
        $pos++;
    }

    $p = $stack[0] + 1;
    while (!empty($stack)) {

        //判断右括号 (})的位置是不是在左括号({)的坐左边
        if ($p < $stack[0]) {
            return '括号不对哦';
        }

        if (($p = strpos($str, $F2, $p)) === false) {
            return '括号不对哦';
        }
        $p++;
        array_shift($stack);

    }

    return '括号都对哦';
}


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|bbs.thinkzhu.com ( 京ICP备14043241号 )

Powered by Discuz! X3.4 © 2001-2012 Comsenz Inc.

GMT+8, 2019-12-24 18:34 , Processed in 0.050957 second(s), 22 queries .

快速回复 返回顶部 返回列表