如何编写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
相关产品推荐
相关产品推荐

