我有一个类似于tvm11551.iso
的字符串,我正在尝试解析它。在这个字符串中,这些粗体数字各不相同:tvm1151.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以获得预期的输出?
您看到的输出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"
}
根据您的模式,在初始匹配之后,我看不出有任何理由使用RegEx。
你只需要这个:
if(preg_match('/^tvm'd{5}'.iso/',$a)){
$b = substr($a, 3, 5);
$c = substr($a, 6, 8);
preg_match返回模式匹配的次数(但由于preg_match总是在找到的第一个匹配处停止,因此它总是返回0或1)。如果你想得到匹配的数字,你必须传递一个数组作为pregmatch的第三个参数。请参阅preg_match文档