查找与子字符串匹配的目录中的所有文件和文件名

时间:2010-01-07 00:43:23

标签: php regex

我正在遍历目录中的文件列表,我希望将我拥有的子字符串与文件名匹配。如果文件名包含子字符串,则返回该文件名,以便我可以删除它。我做了以下事情,它只是返回了所有内容:

while ($file = readdir($dir_handle)) { 

        $extension = strtolower(substr(strrchr($file, '.'), 1)); 
        if($extension == "sql" || $extension == "txt" ) {

            $pos = strpos($file, $session_data['user_id']);

            if($pos === true) {
                //unlink($file);
                echo "$file<br />"; 
            }else {
                // string not found
            }   
        }
} 

我做错了什么?

感谢大家的帮助

4 个答案:

答案 0 :(得分:4)

strpos返回一个整数或FALSE。您需要将测试更新为

$pos !== FALSE 

然后 - 如果要删除文件,可以取消注释unlink()调用。我不确定你的意思是“返回所以我可以删除”。

答案 1 :(得分:1)

假设您使用的是Linux,可以使用带有GLOB_BRACE选项的[glob()] [1]函数执行此操作:

$files = glob('*.{sql,txt}', GLOB_BRACE);

你也可以在那里混合user_id。

不确定它是否适用于Windows。请参阅http://de.php.net/glob,并注意有关GLOB_BRACE选项的说明。

答案 2 :(得分:0)

if ($handle = opendir('/path/to/dir/') {
    $extensions = array('sql' => 1, 'txt' => 1);
    while (false !== ($file = readdir($handle))) { 
        $ext = strtolower(substr(strrchr($file, '.'), 1)); 
        if (isset($extensions[$ext]) && strpos($file, $session_data['user_id']) !== false)
            echo "$file<br />"; 
        else
            echo "no match<br />";
        }
    }
} 

答案 3 :(得分:0)

您可以使用SPL递归执行

foreach (new DirectoryIterator('/path') as $file) {
    if($file->isDot()) continue;
    $filename = $file->getFilename();
    $pathname = $file->getPathname();
    if ( strpos ($filename ,".sql") !==FALSE ) {
        echo "Found $pathname\n";
        $pos = strpos($filename, $session_data['user_id']);
        ......
        #unlink($pathname); #remove your file
    }
}