2012-04-18 91 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; 
    } 
}