【发布时间】:2017-05-11 10:24:49
【问题描述】:
preg_match() 函数能否包含它在匹配数组中找不到的组?
这是我正在使用的模式:
/^([0-9]+)(.[0-9]+)?\s?([^iIbB])?([iI])?([bB])?$/
我正在尝试将人类可读的大小解析为字节。此模式符合我的要求,但前提是我可以按绝对组顺序检索匹配项。
这可以生成最多 5 个匹配组,这将产生一个索引为 0-5 的匹配数组。但是,如果字符串不匹配所有组,则匹配数组可能具有,例如,组 5 实际上在索引 3 处。
我想要的是该模式 (5) 中的最终匹配始终位于匹配数组的相同索引处。因为多个组是可选的,所以在读取匹配数组时我们知道表达式中的哪个组被匹配是非常重要的。
示例情况:regexr.com 的正则表达式测试器将始终以正确的顺序显示所有 5 个组,包括那些不匹配的组。通过启用“全局”和“多行”标志并使用以下文本,您可以将鼠标悬停在蓝色匹配项上以获得良好的视觉效果。
500.2 KiB
256M
700 Mb
1.2GiB
您会注意到并非所有组都始终匹配,但是组索引始终处于正确的顺序。
编辑:是的,我已经在 PHP 中尝试过以下操作:
$matches = [];
$matchesC = 0;
$matchesN = 6;
if (!preg_match("/^([0-9]+)(\.[0-9]+)?\s?([^iIbB])?([iI])?([bB])?$/", $size, $matches) || ($matchesC = count($matches)) < $matchesN) {
print_r($matches);
throw new \Exception(sprintf("Could not parse size string. (%d/%d)", $matchesC, $matchesN));
}
当$size 为“256M”时,print_r($matches); 返回:
Array
(
[0] => 256M
[1] => 256
[2] =>
[3] => M
)
缺少第 4 组和第 5 组。
【问题讨论】:
-
你在 PHP 中测试过吗?见ideone.com/NSm7Iy,所有“空”组都在那里。
-
是的。匹配数组的 print_r() 不包含不匹配的组,导致匹配组的索引倾斜。
-
是的,它不显示最后的项目,but they are there。您只需使用
empty($m[n])检查组是否为空。还是print_r必须打印空组值? -
我想这只是一些额外的工作来迭代到预期的数组大小并执行
array_key_exists()来填充空值。 Kidna 期望preg_match()开箱即用。 -
有一个有趣的事实:在 PHP 中,未参与的组只是没有用空字符串值初始化,因此,组 4 和组 5 是 null,你看起来是对的,这都怪
preg_match。
标签: php preg-match