当前位置: 首页 > 面试题库 >

如何在PHP中使用RegexIterator

阎庆
2023-03-14
问题内容

我尚未找到一个很好的示例,说明如何使用php RegexIterator递归遍历目录。

最终结果将是我想指定一个目录并在其中找到具有给定扩展名的所有文件。例如仅说html /
php扩展名。此外,我想过滤掉.Trash-0,.Trash-500等类型的文件夹。

<?php 
$Directory = new RecursiveDirectoryIterator("/var/www/dev/");
$It = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($It,'/^.+\.php$/i',RecursiveRegexIterator::GET_MATCH);

foreach($Regex as $v){
    echo $value."<br/>";
}
?>

到目前为止,是我得到的结果是:致命错误:消息为’RecursiveDirectoryIterator :: __
construct(/media/hdmovies1/.Trash-0)的未捕获异常’UnexpectedValueException’

有什么建议么?


问题答案:

有两种不同的处理方式,我将提供两种快速的方法供您选择:快速和肮脏,较长和较少脏(尽管是星期五晚上,所以我们被允许去有点疯狂)。

1.快速(又脏)

这涉及只编写一个正则表达式(可以拆分为多个)以用于快速过滤文件集合。

(只有两条注释行对于此概念确实很重要。)

$directory = new RecursiveDirectoryIterator(__DIR__);
$flattened = new RecursiveIteratorIterator($directory);

// Make sure the path does not contain "/.Trash*" folders and ends eith a .php or .html file
$files = new RegexIterator($flattened, '#^(?:[A-Z]:)?(?:/(?!\.Trash)[^/]+)+/[^/]+\.(?:php|html)$#Di');

foreach($files as $file) {
    echo $file . PHP_EOL;
}

这种方法有很多问题,尽管可以很快实现,但只能采用单行代码(尽管正则表达式可能很难破解)。

2.速度较慢(较不脏)

一种更可重用的方法是创建几个定制的过滤器(使用正则表达式,或您喜欢的任何东西!),以将初始可用项的列表RecursiveDirectoryIterator缩减为仅所需项。以下仅是为您快速编写的扩展的一个示例RecursiveRegexIterator

我们从一个基类开始,该基类的主要工作是保留要过滤的正则表达式,所有其他内容都递归给RecursiveRegexIterator。请注意,该类是abstract因为它实际上没有

任何有用的事情:实际的过滤将由将扩展该类的两个类完成。同样,它可以被调用,FilesystemRegexFilter但是(在这个级别上)没有什么要强迫它来过滤与文件系统相关的类(如果我不是很困的话,我会选择一个更好的名字)。

abstract class FilesystemRegexFilter extends RecursiveRegexIterator {
    protected $regex;
    public function __construct(RecursiveIterator $it, $regex) {
        $this->regex = $regex;
        parent::__construct($it, $regex);
    }
}

这两个类是非常基本的过滤器,分别作用于文件名和目录名。

class FilenameFilter extends FilesystemRegexFilter {
    // Filter files against the regex
    public function accept() {
        return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename()));
    }
}

class DirnameFilter extends FilesystemRegexFilter {
    // Filter directories against the regex
    public function accept() {
        return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename()));
    }
}

为了将它们付诸实践,下面的代码以递归方式遍历脚本所在的目录的内容(可以随意编辑!)并筛选出.Trash文件夹(通过确保文件夹名称
特制的正则表达式 匹配 ),并仅接受PHP和HTML文件。

$directory = new RecursiveDirectoryIterator(__DIR__);
// Filter out ".Trash*" folders
$filter = new DirnameFilter($directory, '/^(?!\.Trash)/');
// Filter PHP/HTML files 
$filter = new FilenameFilter($filter, '/\.(?:php|html)$/');

foreach(new RecursiveIteratorIterator($filter) as $file) {
    echo $file . PHP_EOL;
}

特别要注意的是,由于我们的过滤器是递归的,因此我们可以选择尝试如何遍历它们。例如,通过执行以下操作,我们可以轻松地将自己限制为仅扫描多达2个级别的深度(包括起始文件夹):

$files = new RecursiveIteratorIterator($filter);
$files->setMaxDepth(1); // Two levels, the parameter is zero-based.
foreach($files as $file) {
    echo $file . PHP_EOL;
}

添加更多的过滤器(通过使用不同的正则表达式实例化我们的更多过滤类;或通过创建新的过滤类)来满足更特殊的过滤需求(例如文件大小,全路径长度等)也是非常容易的。

PS嗯,这个答案有点ba不休;我试图使它尽可能简洁(甚至消除了大量的超级胡言乱语)。抱歉,如果最终结果使答案不一致。



 类似资料:
  • 问题内容: 我在用PHP编码。我有以下mySQL表: 我正在尝试在PHP中使用mysqli_query函数来描述表。 这是我的代码: 该文档说, 对于成功的SELECT,SHOW,DESCRIBE或EXPLAIN查询,mysqli_query()将返回 mysqli_result 对象。 但是从那里我不知道如何打印,以便显示查询结果。如果可能的话,我想打印$ result,使其看起来像: 我的另一

  • 问题内容: 我想使用Selenium来自动化一些Web任务(不用于测试)。我认为我已经安装了Selenium RC Server,但是由于无法在PHP中找到客户端驱动程序,因此无法编写“测试脚本”(请参阅​​: http //seleniumhq.org/download/)。 我有办法在PHP中使用Selenium吗?这似乎表明我需要PHPUnit http://www.phpunit.de/m

  • 问题内容: 我有以下XML文件,该文件相当大,我无法获取simplexml来打开和读取该文件,因此我正在尝试XMLReader,但在php中没有成功 不幸的是,我还没有找到关于PHP的很好的教程,很想看看我如何才能将每个元素的内容存储在数据库中。 问题答案: 这完全取决于工作单元的大小,但是我想您正在尝试连续对待每个节点。 为此,最简单的方法是使用XMLReader到达每个节点,然后使用Simpl

  • 问题内容: 由于性能问题, 我尝试避免执行Count( )。 (即 从用户中 选择COUNT( )) 如果我在phpMyAdmin中运行以下命令,则可以: 它将返回行数。即用户数量。 但是,如果我在PHP中运行,则无法执行以下操作: 似乎PHP不希望传入两个查询。那么,我该怎么做呢? 问题答案: 仅在使用子句的情况下才有用,但仍想知道不使用会发现多少行。 考虑一下它是如何工作的: 您正在强制数据库

  • 问题内容: 因此,在我正在编写的此程序中,我实际上是使用表单从用户那里获取SQL查询。然后,我继续在数据库上运行该查询。 我知道不要“信任”用户输入,因此我想对输入进行清理。我正在尝试使用,但未能成功使用。 输入以下内容,这就是我要尝试的内容: 这总是给我 “输入无效!” 错误。 当我取出零件并仅对查询运行时, “输入无效” 不输出信息。相反,当我这样做时: 它不输出 “输入无效”。 但是,我需要

  • 问题内容: 我使用PHP显示来自MySQL的数据。这是我的css语句: 它们用于显示表,表头,表日期。我是php CSS的新手,所以我只是想知道如何在php中使用上述CSS样式显示代码: 问题答案: 级联样式表(CSS)是一种样式表语言,用于描述以标记语言编写的文档的表示语义(外观和格式)。 : CSS不是一种编程语言,并且没有服务器端语言(如PHP)随附的工具。但是,我们可以使用服务器端语言来生