栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在PHP中使用RegexIterator

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在PHP中使用RegexIterator

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

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不休;我试图使它尽可能简洁(甚至消除了大量的超级胡言乱语)。抱歉,如果最终结果使答案不一致。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443172.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号