2012-04-18 94 views
3

我需要比较两个版本#来查看一个是否比另一个更大,并且这么做是非常困难的。如何比较版本号的字符串内?

版本1:[email protected] 版本2:[email protected]

我试图剥离所有非数字字符出来,所以我会留下:

版本1:10101 版本2:970

从10.1.0.a.1中删除'a',这样就不行了,我尝试了'test_'和'@'之间的所有内容,然后剥去任何东西在下划线'_'和下划线本身的右侧,但是我仍然必须在str的开始处去掉'V' ING。

即使我可以下降到只是10.1.0.a.1和9.7.0,我怎么能比较这两个?我怎么知道10.1.0.a.1是否大于9.7.0?如果我将小数位去掉,我仍然在1010a1中留下一个非数字字符,但是我需要那个字符来说明我将这个比较的发布版本是10.1.0.b.1,这将会大于10.1.0.a.1。

这使我疯了,有没有人处理过这个?你是如何比较价值的?我使用的是PHP。

回答

4

我想你想考虑使用正则表达式来解析出版本号的“数字”部分 - “10.1.0.a.1”和“9.7.0”。之后,您可以通过'。'登录split。得到两个“版本数组”。

使用版本数组,您可以从中弹出元素,直到找到更高的数字。无论它来自哪个阵列都是更高的版本号。如果任何一个数组用完了,它的版本号就会变小(除非所有剩下的元素都是“0”或“a”或者用来表示“基本版本”的任何语义,例如“10.0.0.a.0”== “10.0”)。如果两者同时用完,那么它们是平等的。

+0

+1简单而有效的解决方案 – Scuzzy 2012-04-18 02:00:50

+0

所有的解决方案,将工作,但这是最好的,因为我可以什么都前检查“基地”版本,如果基本版本是同样,我会继续深入该版本。我只希望PHP会比较单个字母字符(如b> a返回true) – user797963 2012-04-18 21:14:46

1

下面的正则表达式将 “test_V” 和 “@example” 之间不匹配的一切,把它扔进一个数组称为$匹配[1]

$pattern = '/test_V(.*?)(?:_.*?)[email protected]/i'; 
$string = 'version 1: [email protected] version 2: [email protected]'; 
if(preg_match_all($pattern,$string,$matches)) 
{ 
    print_r($matches[1]); 
} 

回报

Array 
(
    [0] => 10.1.0.a.1 
    [1] => 9.7.0 
) 

这会给你首先要弄清楚你想如何拆分相当复杂的版本号。

3

使用explode('.', $versionNum)

$ver1 = '10.1.0.a.1'; 
$ver2 = '10.1.0'; 
$arr1 = explode('.', $ver1); 
$arr2 = explode('.', $ver2); 

$min = min(count($arr1), count($arr2)); 

for ($i = 0; $i < $min; $i++) 
{ 
    if ($i + 1 == $min) 
     echo ($min == count($arr1)) ? $ver2 : $ver1; 
    if ($arr1[$i] > $arr2[$i]) 
    { 
     echo $ver1; 
     break; 
    } 
    elseif ($arr1[$i] < $arr2[$i]) 
    { 
     echo $ver2; 
     break; 
    } 
}