2012-04-18 8 views
3

2つのバージョン番号を比較して、あるものが他のバージョンよりも大きいかどうかを確認する必要があります。バージョン#を文字列内で比較する方法は?

バージョン1:[email protected] バージョン2:[email protected]

私は私が残されることになるすべての非数値文字を除去しようとしました:

version1:10101 version2:970

「a」を10.1.0.a.1から削除していないので、「test_」と「@」の間にすべてを入れて試してみましたアンダースコア '_'の右側とアンダースコアそのものですが、strの始めに 'V'を取り除く必要がありますing。

10.1.0.a.1と9.7.0にまで下がっても、どうすればこれらの2つを比較できますか? 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によって '。'とすることができます。 2つの "バージョン配列"を取得します。

バージョン配列では、より高い数字を見つけるまで要素をポップします。どちらの配列から来ても、より高いバージョン番号です。いずれかの配列が不足している場合は、残りの要素がすべて "0"または "a"であるか、または "ベースバージョン"と言う意味のセマンティクス(例: "10.0.0.a.0" == "10.0")。両方が同時に使い果たされた場合、それらは等しくなります。

+0

+1、シンプルで効果的なソリューション – Scuzzy

+0

が、私は何か他のものの前に「ベース」バージョンを確認することができますので、これは最高で、そしてベースのバージョンがある場合同じ私はバージョンにさらに続けます。私はちょうどPHPが単一のアルファ文字を比較することを願って(b> aがtrueを返すように) – user797963

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; 
    } 
}