PHP 5.6中如何使用preg_match匹配ICO文件扩展名?
问题分析与解决方案
首先得明确:你当前用的正则[.a-zA-Z0-9]完全达不到需求——它只能匹配单个字符(要么是点,要么是大小写字母或数字),根本没法覆盖.62045303.ico这种完整的文件名结构,这就是找不到目标文件的核心原因。
要匹配这种.[随机字母数字串].ico格式的文件,你需要一个能覆盖整个文件名规则的正则表达式,比如:
$pattern = '/^\.[a-zA-Z0-9]+\.ico$/i';
正则规则拆解
^:锚定字符串开头,确保文件名从点开始\.:匹配实际的点(.在正则里是通配符,必须转义才能表示字面意义的点)[a-zA-Z0-9]+:匹配至少1个字母或数字(+表示前面的字符出现1次或多次)\.ico:匹配.ico扩展名(同样转义点)$:锚定字符串结尾,确保文件名严格以.ico结束i:不区分大小写修饰符,让.ABC123.ICO这类文件名也能被匹配到
修改后的完整代码示例
在递归扫描逻辑里加入文件名匹配判断,收集符合规则的文件:
<?php $matchedFiles = recursiveScan('/public_html/'); function recursiveScan($dir) { $tree = glob(rtrim($dir, '/') . '/*'); $result = []; if (is_array($tree)) { foreach($tree as $file) { if (is_dir($file)) { // 递归扫描子目录,合并结果 $result = array_merge($result, recursiveScan($file)); } else { // 获取纯文件名(去掉路径) $filename = basename($file); // 用正确的正则匹配文件名 if (preg_match('/^\.[a-zA-Z0-9]+\.ico$/i', $filename)) { $result[] = $file; } } } } return $result; } // 输出找到的目标文件 print_r($matchedFiles);
额外优化提示
如果你的随机串是十六进制格式(仅包含0-9和a-f),可以把正则里的[a-zA-Z0-9]+改成[a-f0-9]+,配合i修饰符能更精准匹配:
$pattern = '/^\.[a-f0-9]+\.ico$/i';
内容的提问来源于stack exchange,提问作者Adam Kowalski
相关产品推荐
相关产品推荐

