【问题标题】:How to compare version #'s inside a string?如何比较字符串中的版本号?
【发布时间】:2012-04-29 09:50:17
【问题描述】:

我需要比较两个版本号,看看一个是否大于另一个,并且我很难做到这一点。

版本 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,我如何比较这两个?我怎么知道 10.1.0.a.1 是否大于 9.7.0?如果我去掉小数,我仍然在 1010a1 中留下一个非数字字符,但我需要那个字符,以防我比较的发行版本是 10.1.0.b.1,这将大于10.1.0.a.1.

这让我发疯了,以前有人处理过吗?你是如何比较这些值的?我正在使用 php。

【问题讨论】:

    标签: php comparison versioning


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 所有解决方案都可以工作,但这是最好的,因为我可以先检查“基本”版本,如果基本版本相同,我会继续进入该版本。我只是希望 php 将比较单个字母字符(如 b>a 返回 true)
      【解决方案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;
          }
      }
      

      【讨论】:

        【解决方案4】:

        以下正则表达式将匹配 "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
        )
        

        这将使您在弄清楚要如何分解相当复杂的版本号时抢占先机。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-21
          • 2012-02-01
          • 2017-10-26
          • 2011-02-25
          • 2010-09-16
          • 2018-01-23
          • 1970-01-01
          • 2015-11-13
          相关资源
          最近更新 更多