2

tvm11551.iso解析しようとしているのと同様の文字列があります。この文字列では、これらの太字の数字は異なります:tvm 11 5 51 .iso(ここのスペースは無視してください)。その文字列からこれらの2つの数値を抽出する次のプログラムをPHPで作成しました。

$a = "tvm11551.iso";

if(preg_match('/^tvm\d{5}\.iso/',$a)){
    $b = preg_match('/tvm(\d\d)\d\d\d\.iso/' , $a);
    $c = preg_match('/tvm\d\d\d(\d\d)\.iso/' , $a);
    echo "B: " . $b . "<br>";
    echo "C: " . $c;
}

ただし、次のように出力を取得しています。

B: 1
C: 1

期待される出力を得るために正規表現を修正するにはどうすればよいですか?

4

3 に答える 3

5

出力として表示されているのは、一致が成功したときに返される1一致の数であり、その内容ではありません。preg_match()各テストには()キャプチャグループが1つしかないため、1つの一致が返されました。次の3番目の引数として、一致を配列にキャプチャする必要がありますpreg_match()

$a = "tvm11551.iso";
$matches = array();
preg_match('/^tvm(\d{2})5(\d{2})\.iso$/', $a, $matches);

var_dump($matches);
array(3) {
  [0] =>
  string(12) "tvm11551.iso"
  [1] =>
  string(2) "11"
  [2] =>
  string(2) "51"
}
于 2012-08-01T20:52:10.703 に答える
3

あなたが持っているパターンに基づいて、最初の一致の後、正規表現を使用する理由はまったくわかりません。

あなたはこれが欲しいだけです:

if(preg_match('/^tvm\d{5}\.iso/',$a)){
    $b = substr($a, 3, 5);
    $c = substr($a, 6, 8);
于 2012-08-01T20:51:49.367 に答える
1

preg_matchは、パターンが一致した回数を返します(ただし、preg_matchは常に最初の一致で停止するため、常に0または1を返します)。一致した数値を取得する場合は、preg_matchの3番目のパラメーターとして配列を渡す必要があります。preg_matchのドキュメントを参照してください

于 2012-08-01T20:54:11.940 に答える