PHP实现函数version_compare

来源:互联网 发布:网络三大奇书之一 编辑:程序博客网 时间:2024/06/14 08:57

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

<?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