2

我有一个类似于tvm11551.iso我要解析的字符串。在此字符串中,这些粗体数字各不相同:tvm 11 5 51 .iso(请忽略此处的空格)。我用 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

如何修复 RegEx 以获得预期的输出?

4

3 回答 3

5

1您看到的输出是匹配成功后返回的匹配数量,而不是它们的内容preg_match()。由于您的每个测试只有一个()捕获组,因此返回了一个匹配项。您需要将匹配项作为第三个参数捕获到数组中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

根据您拥有的模式,在初始匹配之后,我完全没有理由使用 RegEx。

你只想要这个:

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 的第三个参数。请参阅preg_match 文档

于 2012-08-01T20:54:11.940 回答