3

2つのバージョン番号を比較して、一方が他方よりも大きいかどうかを確認する必要があり、そうするのに非常に苦労しています。

バージョン1:test_V10.1.0.a.1 @ exampleバージョン2:test_V9.7.0_LS @ example

数字以外の文字をすべて削除してみたので、次のようになります。

バージョン1:10101バージョン2:970

これは「a」を10.1.0.a.1から削除するので、それは良くありません。「test_」と「@」の間のすべてを取得してから、アンダースコア「_」とアンダースコアの右側にあるものをすべて削除してみました。それ自体ですが、それでも文字列の先頭にある「V」を削除する必要があります。

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

4 に答える 4

5

使ってはいけませんか?version_compare(ver1、ver2)

http://php.net/manual/en/function.version-compare.php

于 2012-10-26T19:29:00.793 に答える
4

正規表現を使用して、バージョン番号の「番号」部分(「10.1.0.a.1」と「9.7.0」)を解析することを検討したいと思います。その後、「。」で分割できます。2つの「バージョン配列」を取得します。

バージョン配列を使用すると、より大きな数が見つかるまで要素をポップします。どちらのアレイから取得した場合でも、バージョン番号は高くなります。いずれかの配列がなくなると、バージョン番号は小さくなります(残りのすべての要素が「0」または「a」、または「ベースバージョン」と言うために使用するセマンティクス(「10.0.0.a.0」など)でない限り)== 「10.0」)。両方が同時になくなる場合、それらは等しいです。

于 2012-04-18T01:54:58.550 に答える
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;
    }
}
于 2012-04-18T02:07:55.200 に答える
1

次の正規表現は、「test_V」と「@example」の間のすべてに一致し、$matches[1]という配列にスローします。

$pattern = '/test_V(.*?)(?:_.*?)?@example/i';
$string = 'version 1: test_V10.1.0.a.1@example version 2: test_V9.7.0_LS@example';
if(preg_match_all($pattern,$string,$matches))
{
  print_r($matches[1]);
}

戻り値

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

これにより、かなり複雑なバージョン番号をどのように分解したいかをすぐに理解できます。

于 2012-04-18T01:56:25.317 に答える