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

如何编写PHP脚本查找名称含动态子串的文件(以favicon为例)

完善PHP递归扫描脚本以匹配特定文件名格式

我看了你当前的代码片段,里面有几个小问题需要修正:比如变量作用域问题($text在递归函数里无法直接访问)、错误的字符串拼接语法('favicon' .*. 'ico'是无效写法),还有strpos只能做模糊匹配,没法精准锁定你要的文件名格式。下面我会针对你的两个需求分别完善脚本:

一、匹配格式为favicon_xxxx.ico的文件

这里的xxxx是任意可变子串(比如favicon_1234.ico、favicon_abcd.ico都符合要求),我们用正则表达式来精准匹配文件名,同时修正递归函数的变量传递逻辑:

<?php
// 定义正则匹配模式:严格匹配以favicon_开头、.ico结尾的文件名
$matchPattern = '/^favicon_.+\.ico$/';

// 递归扫描目录的函数,接收目标目录和匹配规则
function recursiveScan($dir, $pattern) {
    // 获取目录下的所有文件和子目录
    $items = glob(rtrim($dir, '/') . '/*');
    
    if (is_array($items)) {
        foreach ($items as $item) {
            if (is_dir($item)) {
                // 递归遍历子目录
                recursiveScan($item, $pattern);
            } elseif (is_file($item)) {
                // 提取纯文件名(排除路径部分,避免干扰匹配)
                $filename = basename($item);
                // 用正则精准匹配文件名
                if (preg_match($pattern, $filename)) {
                    echo "找到匹配文件:{$item}<br/>";
                }
            }
        }
    }
}

// 调用函数,传入目标目录和匹配规则
recursiveScan('/public_html/wp-admin/', $matchPattern);
?>

代码说明:

  • basename($item)用来提取纯文件名,避免路径中的字符干扰匹配结果
  • 正则/^favicon_.+\.ico$/的含义:
    • ^:匹配字符串开头,确保文件名以favicon_起始
    • .+:匹配任意一个或多个字符(如果需要限制xxxx只能是数字/字母,可以换成\w+)
    • \.ico:匹配.ico后缀(.在正则中是特殊字符,必须转义)
    • $:匹配字符串结尾,确保文件名严格以.ico结束

二、匹配名称末尾包含动态子串的文件

如果你的需求是匹配文件名末尾带有任意动态子串的文件(比如所有以_temp.txt结尾、或.old结尾的文件),只需要调整正则模式即可。下面给几个实用示例:

示例1:匹配所有以_dynamic结尾的文件(不限后缀)

$matchPattern = '/_dynamic$/'; // 精准匹配文件名末尾的_dynamic

示例2:匹配所有以.bak为后缀的备份文件

$matchPattern = '/\.bak$/';

示例3:动态传入子串实现灵活匹配

如果你想让子串可动态调整,可以把它作为参数传入函数,同时用preg_quote()处理特殊字符,避免正则语法错误:

<?php
function recursiveScanWithDynamicSuffix($dir, $targetSuffix, &$result = []) {
    // 转义子串中的特殊正则字符(比如.、*)
    $safeSuffix = preg_quote($targetSuffix, '/');
    $pattern = "/{$safeSuffix}$/";
    
    $items = glob(rtrim($dir, '/') . '/*');
    if (is_array($items)) {
        foreach ($items as $item) {
            if (is_dir($item)) {
                recursiveScanWithDynamicSuffix($item, $targetSuffix, $result);
            } elseif (is_file($item)) {
                $filename = basename($item);
                if (preg_match($pattern, $filename)) {
                    $result[] = $item;
                }
            }
        }
    }
    return $result;
}

// 调用示例:查找所有末尾带有"_old.ico"的文件
$matchedFiles = recursiveScanWithDynamicSuffix('/public_html/wp-admin/', '_old.ico');
print_r($matchedFiles);
?>

额外优化建议

如果不想直接输出结果,而是要收集所有匹配的文件路径,可以像上面示例3那样,用引用传递的数组来存储结果,方便后续处理。

内容的提问来源于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.20 12:22:01