2011-11-11 9 views
2

文字列のバージョン番号のみを取得しようとしていますが、文字列が特定の形式でフォーマットされていません。次の形式のいずれかPHPで正規表現を使用して文字列の一部を返す

  • 「怒っている鳥のV2.0.0」
  • 「怒っている鳥2.0.0」
  • 「v1.25例えば、文字列がで書かれてもよい(これらに限定されません) 「
  • 『バージョン:これらの文字列のそれぞれから2.0.0『:1.3』
  • 」2.0.1」私は唯一のバージョン番号(例を返しますPHPの関数を作成する必要が

』 。この作業で正規表現を使用すると便利ですか?もしそうなら、私はを使用して、どのようなPCRE(perl互換正規表現)PHP関数を組み込む必要がありますか?

正規表現をほとんど理解していないことに注意してください。ありがとう!

答えて

3

これを試してみてください:

function GetVersion($string) 
{ 
    if (preg_match("#(\d+\.\d+(\.\d+)*)#", $string, $match)) { 
     return $match[1]; 
    } 
} 

$test_strings = array(
    "Angry Birds v2.0.0", 
    "Angry Birds 2.0.0", 
    "v1.25", 
    "Version: 1.3", 
    " 2.0.1 ", 
    "Dots4You v3.15" 
); 

foreach ($test_strings as $string) { 
    printf("%s<br>", GetVersion($string)); 
} 

結果:

2.0.0

2.0.0

1.25

1.3

2.0.1

3.15

@Tim Pietzcker:

あなたのコードは、プロジェクトの名前を失敗します。単独でdigiを含む例えば、 "Dots4You v3.15"はバージョンとして "4"をキャッチします。バージョンには少なくとも2桁と1ドットを含める必要があります。

+0

あなたのバージョンはa)inelegant(ドライ)!b)バグ:UltraEdit 17.30.0.1002(実際のバージョン番号)を試してみてください。 –

+0

は素晴らしい作品です、ありがとうございます! – user954912

2

これは、正規表現が適していると思われます。例えば

if (preg_match('/\d+(?:\.\d+)*/', $subject, $regs)) { 
    $result = $regs[0]; 
} else { 
    $result = ""; 
} 

説明:

\d+ # Match one or more digits 
(?: # Try to match... 
\. # a dot 
\d+ # and one or more digits... 
)* # zero or more times. 

また、これは、 "Acrobat Readerの9" のような単一のバージョン番号と一致しました。あなたがそれをしたいと、少なくとも1個のドットを必要としない場合は、代わりに単に*+を使用します。/\d+(?:\.\d+)+/

それとも、あなたは正規表現が「Dots4You」のような言葉の中に一致することはありませんことを確認するためにword boundary anchorを使用することができます。 /\d+(?:\.\d+)*\b/

+0

ありがとうございます!あなたは '/\d+(?:\.¥d+)*/'が何を意味するのか説明できますか? 私はそれを見て、私はちょうちん、笑を参照してください。 – user954912

+0

問題ありません。偉大な正規表現のチュートリアルについてはhttp://www.regular-expressions.infoを見てください。 –

+0

優秀、ありがとう – user954912

関連する問題