如何比较字符串中的版本#?

时间:2012-04-18 01:46:18

标签: php comparison versioning

我需要比较两个版本的#,看看一个是否比另一个更大,并且我真的很难这样做。

版本1:test_V10.1.0.a.1@example 版本2:test_V9.7.0_LS@example

我已经尝试剥离所有非数字字符,所以我会留下:

版本1:10101 版本2:970

从10.1.0.a.1中删除了'a',这样做并不好,我尝试在'test_'和'@'之间取出所有内容,然后剥去下划线右边的任何内容'_'和下划线本身,但我仍然需要在字符串的开头删除'V'。

即使我可以达到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 个答案:

答案 0 :(得分:5)

你不应该使用吗? version_compare(ver1,ver2)

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

答案 1 :(得分:4)

我认为你想考虑使用正则表达式来解析版本号的“数字”部分 - “10.1.0.a.1”和“9.7.0”。之后,您可以{'3}通过'。'获得两个“版本阵列”。

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

答案 2 :(得分: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;
    }
}

答案 3 :(得分: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
)

这将帮助您了解如何拆分相当复杂的版本号。