如何在 PHP 中使用 RegexIterator

2024-02-21

我还没有找到如何使用 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/>";
}
?>

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

有什么建议么?


有几种不同的方法可以解决这样的问题,我将提供两种快速方法供您选择:快速而肮脏的方法,与更长且不太肮脏的方法(不过,这是周五晚上,所以我们可以去有点疯狂)。

1. 快速(但肮脏)

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

(Only the two commented lines are really important to the concept.)

$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因为它实际上并没有do任何有用的东西:实际的过滤将由两个类来完成,这两个类将扩展这个类。另外,它也可以被称为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文件夹(通过确保文件夹名称do match特制的正则表达式),并且仅接受 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;
}

添加更多过滤器(通过使用不同的正则表达式实例化更多过滤类;或者通过创建新的过滤类)来满足更专业的过滤需求(例如文件大小、完整路径长度等)也非常容易。

P.S. Hmm this answer babbles a bit; I tried to keep it as concise as possible (even removing vast swathes of super-babble). Apologies if the net result leaves the answer incoherent.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PHP 中使用 RegexIterator 的相关文章

  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的
  • RegularExpressionAttribute - 如何使其客户端验证不区分大小写?

    我有一个用于客户端验证的字符串 private const String regex b d 5 s s d 5 A Z 2 d 3 s s 1 d 3 s 我在我的中使用这个字符串 RegularExpression regex Erro
  • 正则表达式:无法找出与单个事件匹配的表达式,并且仅匹配包含特定单词的行

    我正在尝试使用 Sublime Text 作为编辑器清理并合并一些旧的日历文件 x ics 打开文件会得到一个长文件 如下所示 我想删除 即替换为任何内容 文件中在摘要中提及生日的所有条目 VEVENT 并保留所有其他条目 因此我使用正则表
  • 正则表达式查找字符串中的整数和小数

    我有一个像这样的字符串 str1 12 ounces str2 1 5 ounces chopped 我想从字符串中获取金额 无论它是否是小数 12 或 1 5 然后获取紧邻的前一个测量值 盎司 我能够使用一个非常基本的正则表达式来获取测量
  • 来自本地 XML 的模拟 SoapClient 响应

    我想用文件中的 XML 来模拟 SoapClient 的响应 我如何创建一个 stdClass 对象 就像 SoapClient 从文件返回一样 客户端已经包装了 SoapClient 因此可以轻松模拟响应 我的模拟是这样的 soapCli
  • jquery上传完成后重定向到新页面

    我正在尝试让这个 jquery 工具与我的网站一起使用以进行文件上传 https github com blueimp jQuery File Upload https github com blueimp jQuery File Uplo
  • 如何将行变成列?

    我有一个数据库 其中存储分组到项目中的关键字以及与每个关键字相关的数据 然后我显示每个项目的数据网格 每个关键字一行和几列 全部从同一个表 数据 中检索 我有 4 个表 关键字 项目 group keywords 和数据 keywords
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • Doctrine 1 和 Symfony 1 的多个主键?

    我已经知道在 Symfony 1 和 Doctrine 1 中不可能使用多个主键 但是你们知道有什么好的解决方法吗 除了多对多关系之外 原则 1 不适用于多列上的主键 但如果你想使用多对多关系 请像这样使用 BlogPost columns
  • Yii2 中 init() 和 __construct() 方法有什么区别

    init 方法 public function init construct method public function construct 那么 它们之间有什么区别 应该使用哪一个呢 init 是从以下对象扩展的任何对象的方法yii b
  • Word通配符搜索的正则表达式查找包含至少3个连续数字的括号

    在以下示例中 airspeed AS user 104A 104B device 101 vehicles 105A C 搜索应该找到 104A 104B 101 and 105A C 但不是 AS 我尝试使用 0 9 0 9 0 9 但这
  • 重新排列数组键 php [重复]

    这个问题在这里已经有答案了 我有这个数组 Array 15 gt 13 1 16 gt Mark one answer 19 gt You see a car on the hard shoulder of a motorway with
  • 选取散列第 N 个元素的最快方法

    我有一个大哈希表 带有字符串索引的数组 并正在寻找一个函数quickly从中选取第一个 理想情况下也是第 N 个 元素 array shift and reset 对于我的需求来说太慢了 UPDATE 我也不是在寻找基于引用的解决方案 该函
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • phpinfo 说 php.ini 路径是 C:\Windows 但那里没有 php.ini

    我们正在尝试从 PHP5 切换到 PHP7 现在我们已经安装了 Apache 并且 PHP 可以运行了 然而 我们在php ini文件没有任何作用 Via phpinfo 我们意识到原因是Configuration File php ini
  • Java 正则表达式 - 字母数字,最多一个连字符,句点或下划线,七个字符长

    我是 Java 正则表达式工具的新手 尽管它们潜力巨大 但我很难完成这项任务 我想编写一个正则表达式来验证遵循以下语法的输入字符串 小写字母和数字的任意组合 仅一个下划线 一个破折号或一个句号 无其他特殊字符 最小长度为 5 我想出了以下解
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • 扩展 RegExp 以获取文件扩展名

    我知道 已经有很多基于 RegExp 的解决方案 但是我找不到适合我需求的解决方案 我有以下函数来获取 URL 的各个部分 但我还需要文件扩展名 var getPathParts function url var m url match w
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f

随机推荐

  • 计算 Delaunay 三角剖分的 Voronoi 区域的大小?

    我想计算一组二维 Voronoi 区域面积的平均值和标准差 如果该区域延伸到无穷大 我只需将其剪切到单位正方形 但是 如果可能的话 我想从 Delaunay 三角剖分中进行计算 而不需要显式计算 Voronoi 区域 这是否可能 或者直接计
  • 如何在所有新的 Play 计费库中检查订阅的购买状态?

    您好 我正在使用新的 Play Billing Library 进行应用内订阅 https developer android com google play billing billing library html https devel
  • python 字典键搜索

    我想知道如何对 python 字典中的键执行某种索引 这本词典大约容纳了400 000 个项目 所以我试图避免线性搜索 基本上 我想知道是否userinput位于任何字典键内 for keys in dict if userinput in
  • 1976 年 3 月 28 日至 29 日期间 java.util.GregorianCalendar 发生了什么?

    尝试使用 GregorianCalendar 在计算自特定日期以来的天数时 我陷入了奇点 在 scala 解释器中 我输入 scala gt import java util GregorianCalendar scala gt impor
  • 如何从 ASP.Net Core 配置文件合并多个数组?

    我想在我的应用程序中动态加载和注册服务 为此 我需要能够从解决方案中的不同项目加载配置文件 并将它们的值合并到单个 json 数组中 不幸的是 默认情况下 ASP Net Core 配置会覆盖值 我使用以下代码注册文件 Program cs
  • Vista 中的 sed - 如何删除之间的所有符号?

    我有一个 bat 文件 我应该用它来删除一个文件的一部分并保存到另一个文件中 我需要删除文本 aaa bbb 和 ccc ddd 之间的所有符号 也就是说 如果我有文字 aaa bbb 1 2 3 ccc ddd 我应该有输出 aaa bb
  • 是否有一个工具可以为任意非托管 DLL 生成 P/Invoke 签名?

    我偶然发现了一个可以为 Microsoft 自己的非托管 DLL 生成 P Invoke 签名的工具 PInvoke 互操作助手 http clrinterop codeplex com releases view 14120 是否有类似的
  • 从数组初始化 QVector

    我从函数接收一个数组作为指针 并希望从中初始化一个 QVector 现在我这样做 void foo double receivedArray size t size QVector
  • 在抽象构造函数中访问重写 val 时出现 NullPointerException

    考虑以下 简化的 示例 abstract class Bar T val f PartialFunction T T val default PartialFunction T T case x gt x val chained f orE
  • 导入环境变量反应前端

    我已经使用引导了一个应用程序create react app 我有一个令牌 但不想推送到 GitHub 我已经跑了yarn add dontenv然后尝试将环境变量导入到我的App js file 我的代码看起来像这样 env TOKEN
  • 使用 C# .NET 驱动程序 2.0 投影 mongodb 子文档

    我有以下结构 public class Category BsonElement name public string CategoryName get set BsonDateTimeOptions BsonElement dateCre
  • 如何监听子窗口关闭?

    我正在以这种方式打开 Facebook 共享的子窗口 window open sharingUrl toolbar 0 status 0 width 626 height 436 当用户单击共享或关闭时 窗口会自动关闭 有没有办法为这些事件
  • 如何刷新“RandomAccessFile”(java)?

    我在java中使用RandomAccessFile file new RandomAccessFile filename rw file writeBytes 如何确保这些数据刷新到操作系统 没有 file flush 方法 请注意 我实际
  • 调整大小时出现黑色边框

    我开始了我的WPF学习之旅 经过几天的编码 我发现每当我调整任何 WPF 表单的大小时 调整大小时底部和右侧都会出现黑色边框 就像一个伪影 就好像屏幕太慢一样 在使用 winform 时我从未注意到这一点 就像这样 这是一个已知问题吗 有什
  • VSCode的默认设置文件的位置在哪里?

    在 Windows 计算机上 VS Code 用户设置文件位于 AppData Code User settings json 当我们从上述位置打开用户设置文件或转到左侧窗格中时 包含默认设置的文件的位置是什么 文件 gt 首选项 gt 设
  • Scada-Lts - “未指定数据源”错误

    我尝试使用 jdk 1 7 在 Tomcat 7 上运行 Scada Lts 但出现以下错误 SEVERE Exception sending context initialized event to listener instance o
  • 如何使用 Process.Start("outlook.exe") 运行 Outlook 并重新获得控制权

    我的 C 程序需要启动 Office Outlook 并获取当前的 正在运行的 Outlook 应用程序 为了做到这一点 我实现了以下简单的程序 所以如果你愿意 你可以简单地测试它 using Outlook Microsoft Offic
  • .NET 的状态机框架

    我工作中的系统基本上是一个消息驱动的状态机 它接收各种类型的消息 根据消息查找某些上下文 状态 然后根据消息和当前状态决定要做什么 通常结果是一条消息被发送到系统之外 有没有好的开源框架可以在 NET 中实现状态机 我研究了最新版本的 Wi
  • Oracle sql MERGE INTO 带有单个 where 子句

    我有以下 SQL 代码 这是我到目前为止所得到的 MERGE INTO SCHEMA1 TABLE 1 table1 USING SELECT DISTINCT table2 column1 view1 column2 FROM SCHEM
  • 如何在 PHP 中使用 RegexIterator

    我还没有找到如何使用 php RegexIterator 递归遍历目录的好例子 最终结果是我想指定一个目录并查找其中具有某些给定扩展名的所有文件 例如只说 html php 扩展 此外 我想过滤掉 Trash 0 Trash 500 等类型