1

インストール済みのアプリケーションと使用可能なアプリケーションのバージョン番号を比較するスクリプトを使用しています。通常、単純な比較演算子を使用します。私はこのアプリケーションを PHP 5.3 環境で構築しているので、version_compare()の使用を検討しましたが、それは私のニーズに完全に適合していないようです。

比較しているバージョン文字列は多くの形式に従うことができますが、これまでに遭遇したものは次のとおりです。

  • 「2.6.18-164.6.1.el5」対「2.6.18-92.1.13.el5」
  • 「4.3p2」対「5.1p1」
  • 「5.1.6」対「5.2.12」
  • 「2.6.24.4-foo.bar.x.i386」対「2.4.21-40」

ご覧のとおり、私が作業するための一貫した形式は実際にはありません。

私が検討したことの 1 つは、各バージョン文字列を数値以外の文字で分割し、結果の配列を反復して相対インデックスを比較することでした。ただし、特に「2.6.24-4-foo.a.12.i386」と「2.6.24-4-foo.b.12」の場合、それが良い方法かどうかはわかりません.i386'.

特にPHP環境で、このような非常に緩いバージョン番号を比較する十分にテストされた方法はありますか?

4

2 に答える 2

2

シンボルによる分割 ( preg_splitを参照) および各要素を数値で比較する (両方が数値の場合) または文字列比較を使用する (両方が英数字の場合) は、例で機能します。

    '2.6.18-164.6.1.el5' > '2.6.18-92.1.13.el5'
    2 6 18 164 6 1 e15
    2 6 18 92 1 13 e16 // より高い
              ^

    '4.3p2' < '5.1p1'
    4 3 p2
    5 1 p1 // より高い
    ^

    '5.1.6' < '5.2.12'
     5 1 6
     5 2 12 // 高い
        ^

    '2.6.24.4-foo.bar.x.i386' > '2.4.21-40'
     2 6 24 4 foo bar x i386 // 高い
     2 4 21 40 --- --- - ----
        ^

落ちる可能性があるのは、5.2-alpha-foo と 5.2.49.4-beta-bar のようなバージョンで、純粋な数字の部分文字列と英数字の部分文字列を比較する必要があります。

    5.2-alpha-foo > 5.2.49.9.-beta-bar
    5 2 alpha foo ---- --- // 間違っている - ascii 65(a) 対 52(4)
    5 2 49 4 ベータバー
          ^

これは、英数字の部分文字列と比較して純粋に数字の部分文字列がある場合はいつでも、英数字フィールドを 0 として扱うことで解決できます。

于 2010-03-01T21:31:56.720 に答える
0

参考用に、rpm のバージョン文字列を次のように比較します。

  • 英数字以外のすべての文字で分割
  • 連続する数字とすべての数字以外の文字をまとめてグループ化します (つまり、1.12.ab002 は 1、12、ab、002 に分割されます)。
  • 各グループを左から右に比較する
    • 両方のバージョンに数値グループがある場合、数値として比較されます (つまり、1 = 001 および 12 > 5)。
    • いずれかが非数値グループの場合、単純な文字列比較が実行されます
  • 最初の等しくない比較は結果です
  • 長いバージョンは大きいと見なされます (つまり、1.2.3 < 1.2.3.0 および alp < alpha)。

これには欠陥があります: 1.2.3rc1 > 1.2.3および1.2.3alpha > 1.2.3 正しくない可能性があります

于 2010-03-01T22:04:06.937 に答える