PHP实现函数version_compare

自己写的,肯定还有更加简便的方法。。。。

<?php 
    function version_compare2($v1, $v2) 
    { 
        try{

            if( strlen($v1) < 3 || strlen($v2) < 3 ){
                throw new InvalidArgumentException("版本号格式输入错误");
            }
            $arr = array('dev','alpha','a','beta','b','rc','#','pl','p');
            $pattern = '/[a-z#]+/';
            preg_match($pattern,strtolower($v1),$res1);
            preg_match($pattern,strtolower($v2),$res2);
            if( isset($res1[0])  ){
                if(!in_array($res1[0],$arr)) {
                throw new InvalidArgumentException($v1."版本号输入错误");
                }
            }
            if(  isset($res2[0]) ){
                if(!in_array($res2[0],$arr)) {
                throw new InvalidArgumentException($v2."版本号输入错误");
                }
            }
        } catch (InvalidArgumentException $e) {
            echo  $e->getMessage();
            exit;
        }

        $replace = array("_", "-","+");
        $v1 = str_replace($replace, ".", strtolower($v1));
        $v2 = str_replace($replace, ".", strtolower($v2));

        $search = array('/\.*dev\.*/','/\.*\ba\b\.*/','/\.*\bb\b\.*/','/\.*rc\.*/','/\.*alpha\.*/','/\.*
                        beta\.*/','/\.*pl\.*/','/\.*\bp\b\.*/','/\.*#\.*/');
        $rep = array('.dev.','.a.','.b.','.rc.','.alpha.','.beta.','.pl.','.p.','.#.');
        $v1 = preg_replace ($search, $rep, $v1); 
        $v2 = preg_replace ($search, $rep, $v2);

        $v1 = explode(".", $v1);
        $v2 = explode(".", $v2);  

        foreach ($v1 as $depth => $aVal) 
        { 
            if (isset($v2[$depth])) 
            { 
                $num1 = getNum($aVal);
                $num2 = getNum($v2[$depth]);

                if($num1==0 && $num2 == 0)
                {
                    if($aVal > $v2[$depth])
                    {
                        echo "第一个版本号 > 第二个版本号";
                        exit;
                    }elseif ($aVal < $v2[$depth]) {
                        echo "第一个版本号 < 第二个版本号";
                        exit;
                    }
                }elseif ($num1 < $num2 ) {
                    echo "第一个版本号 < 第二个版本号";
                    exit;
                }elseif ($num1 > $num2 ) {
                    echo "第一个版本号 > 第二个版本号";
                    exit;
                }

            }else{

                echo "第一个版本号 > 第二个版本号";
                exit;
            } 
        }

        $result =  (count($v1) < count($v2)) ? -1 : 0; 
        if($result == -1)
        {
            echo "第一个版本号 < 第二个版本号";
        }else{
            echo "第一个版本号 = 第二个版本号";
        }
    }

    function getNum($val)
    {
        switch ($val) 
        {
            case 'dev':
                return 1;
                break;
            case 'alpha':
                return 2;
                break;
            case 'a':
                return 2;
                break;
            case 'beta':
                return 3;
                break;    
            case 'b':
                return 3;
                break;
            case 'rc':
                return 4;
                break;
            case '#':
                return 5;
                break;
            case 'pl':
                return 6;
                break;    
            case 'p':
                return 6;
                break;
            default:
                return 0;
        }

    }

    // $v1 = '4.3.2';
    // $v2 = '4.3.2';
    // version_compare2($v1,$v2);//第一个版本号 = 第二个版本号

    // $v3 = '4.3.2_dev';
    // $v4 = '4.3.2_pl';
    // version_compare2($v3,$v4);//第一个版本号 < 第二个版本号

    // $v5 = '4.3.2RC1';
    // $v6 = '4.3.2RC2';
    // version_compare2($v5,$v6);//第一个版本号 < 第二个版本号

    // $v7 = '4.3.1';
    // $v8 = '4.3.2';
    // version_compare2($v7,$v8);//第一个版本号 < 第二个版本号

    // $vv1 = '4.3.2#';
    // $vv2= '4.3.2+alpha';
    // version_compare2($vv1,$vv2);//第一个版本号 > 第二个版本号

    // $vv3 = '4.3.2_beta';
    // $vv4 = '4.3.2_p';
    // version_compare2($vv3,$vv4);//第一个版本号 < 第二个版本号

    $vv5 = '4.3.2_b';
    $vv6 = '4.3.2_a';
    version_compare2($vv5,$vv6);//第一个版本号 > 第二个版本号



 ?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值