PHP正则匹配文件路径不符合预期,如何修正适配groupCode规则?
正则修正方案
原有代码问题
$groupCode后直接跟+量词,会重复匹配$groupCode的最后一个字符,当$groupCode为1时会变成1+,匹配所有以1开头的文件名前缀,导致误匹配- 未对路径、分组编码变量做正则特殊字符转义,若变量包含
./*等正则保留字符会导致匹配逻辑异常 - 未加字符串首尾锚定,可能匹配到文件路径的中间片段
- 后缀前的
.未转义,会匹配任意字符
修正后代码
$imagesToAdd = []; // 先转义正则特殊字符,避免变量内容干扰匹配规则 $escapedImagePath = preg_quote($imagePath, '#'); $escapedGroupCode = preg_quote($groupCode, '#'); foreach (glob($imagePath.'/'.$groupCode.'*.{jpg,png}', GLOB_BRACE) as $filepath) { $match = (int) preg_match('#^'.$escapedImagePath.'/'.$escapedGroupCode.'(?:-\d+)?\.(png|jpg)$#', $filepath); if ($match !== 0) { $imagesToAdd[] = $filepath; } }
正则规则说明
^:锚定字符串开头,确保从路径的起始位置开始匹配- 转义后的
$escapedImagePath/$escapedGroupCode:完全匹配变量的原始内容,不会被正则解析 (?:-\d+)?:非捕获组,匹配可选的-加任意长度数字片段,?表示该片段可存在可不存在\.:转义后的点,仅匹配文件后缀前的真实点符号(png|jpg):匹配指定的图片后缀$:锚定字符串结尾,确保路径末尾没有多余字符
匹配效果验证
- 当
$groupCode = 1时,仅匹配1.jpg、1.png、1-1.png、1-9999.jpg这类路径,不会匹配123123123-1.png、12111111.jpg - 当
$groupCode = 123-1时,仅匹配123-1.jpg、123-1.png、123-1-任意数字.(png|jpg)这类路径
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

