You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:15:23