爵士手 / htaccess-parser
用PHP实现的 .htaccess 解析器和验证器
Requires
- php: ^8.2
Requires (Dev)
- jazzman/php-cs-fixer-rules: ^0.2.0
- phpunit/phpunit: ^10.3
- rector/rector: ^0.17
This package is auto-updated.
Last update: 2024-09-05 22:13:51 UTC
README
轻量级的PHP htaccess解析器
简介
PHP Htaccess Parser 是一个轻量级的库,可以解析(或标记,如果您喜欢)Apache .htaccess 文件。它是为个人使用而开发的,用于安全地读取和操作 .htaccess 文件。
特性
解析器支持
- 指令(例如:
Options -MultiViews
) - 块和子块(例如:
<IfModule mod_headers.c>
) - 多行语句(以
/
结尾的行) - 空白行
- 注释
安装
您可以通过克隆 Git 仓库,下载 phar 归档(即将推出)或使用 composer 进行安装。
Git 克隆
git clone https://github.com/tivie/php-htaccess-parser.git
Composer
将以下行添加到您的 composer.json 中
{ "require": { "tivie/htaccess-parser": "*" } }
或运行以下命令
php composer.phar require tivie/htaccess-parser
工作原理
解析 .htaccess 文件中的每一行,然后将其转换为以下标记之一
每个标记实现了 TokenInterface,它提供了一个简单的 API 来读取和修改其属性。
标记聚合在 HtaccessContainer 中,可以使用它来添加、修改或删除标记对象,并将其作为纯文本或 JSON 输出。
快速使用指南
使用 PHP Htaccess Parser 非常简单。
$file = new \SplFileObject('path/to/.htaccess'); $parser = new \JazzMan\HtaccessParser\Parser(); $htaccess = $parser->parse($file);
然后您可以使用 $htaccess
来操作 .htaccess 内容。
$block = new Block(); $htaccess[0] = $block;
例如,打印文件的第一标记
echo $htaccess[0];
将标记或 HtaccessContainer 对象强制转换为字符串将返回该元素的字面表示,可以用来重新创建 .htaccess 文件。
$output = (string) $htaccess; file_put_content('.htaccess', $htaccess);
组件
解析器
Parser 类 是库的主要组件。由于其构造函数不要求任何强制参数,因此初始化 Parser 对象非常简单
$parser = new \JazzMan\HtaccessParser\Parser();
解析器选项
可以通过以下方法和/或选项更改解析器的行为
设置文件
解析器使用 \SplFileObject 来访问文件。您可以在构造函数中通过调用 setFile()
或作为 $parser->parse
的第一个参数设置适当的文件
$parser = new Parser(new \SplObjectStorage('/path/to/file')); $parser->setFile(new \SplObjectStorage('/path/to/file')); $parser->parse(new \SplObjectStorage('/path/to/file'));
更改容器
默认情况下,$parser->parse()
返回一个 HtaccessContainer 对象(它扩展了 ArrayObject),其中包含新标记的 .htaccess 文件。您可以通过调用 setContainer()
方法来更改返回的对象
$parser->setContainer($myContainer);
$myContainer
可以是一个数组或实现 ArrayAccess
的对象。
使用数组
每个标记都是一个实现 TokenInterface
的对象,它提供了几个有用的方法。但是,如果您更喜欢,您可以指示解析器使用简单的数组,通过以下方式
- 调用方法
useArrays()
$parser->useArrays(true);
- 使用
USE_ARRAYS
标志与parse
方法。
$parser->parse(null, USE_ARRAYS);
忽略空白行和注释行
您可以通过以下方式指示解析器忽略空白行、注释行或两者
- 调用相应的方法
$parser->ignoreWhiteLines(true) ->ignoreComments(true);
- 或将它作为标志设置在
$parser->parse
中
$parser->parse(null, IGNORE_WHITELINES|IGNORE_COMMENTS);
回滚文件
默认情况下,在序列化之前,解析器会将文件指针回滚到开头。您可以通过调用 rewindFile
方法来覆盖此行为。
$parser->rewindFile(false);
扩展解析器
解析器类提供了开发者可以覆盖的API点。有关更多信息,您可以查看https://github.com/tivie/php-htaccess-parser/blob/master/src/Parser.php中的代码。
HtaccessContainer 对象
默认返回的对象(HtaccessContainer)实现了 ArrayAccess,因此您可以使用数组的方式访问定义。该数组的键是数字的,并且按照它们在原始文件中的出现顺序排列。
获取标记
由于解析器返回数组或类似数组的对象,您可以通过索引获取特定的标记。
$firstToken = $htaccess[0];
您还可以使用 search
方法通过名称查找特定的标记。
$modRewrite = $htaccess->search('modRewrite');
您可以将搜索限制为特定的标记类型。
$modRewrite = $htaccess->search('modRewrite', \Tivie\HtaccessParser\Token\TOKEN_BLOCK);
修改标记
TokenInterface 提供了一个通用的API,您可以使用它来操作标记。
$token->setName('fooBar'); //Changes the name of the Token $token->setArguments('foo', 'bar', 'baz'); //Changes the Token arguments
然而,请注意,对于某些标记,参数数组并没有多少意义。例如,注释标记 只期望1个参数(注释的实际文本),而 空白行标记 不期望任何参数,因此额外的参数将被 静默忽略。
添加标记
您可以通过创建和附加来添加标记。
$newBlock = new Block('modRewrite'); $htaccess[] = $block;
您还可以使用 insertAt
在特定索引处插入标记。
$newBlock = new Block('modRewrite'); $htaccess->insertAt(4, $newBlock);
输出 .htaccess 文件
为了输出 .htaccess txt 文件,您可以强制转换 HtaccessContainer 为字符串,并将结果字符串写入文件。
$output = (string) $htaccess; file_put_content('.htaccess', $output);
您还可以使用 txtSerialize
方法来控制输出的格式。
$output = $htaccess->ignoreWhiteLines(true) ->ignoreComments(false); file_put_content('.htaccess', $output);
注意:请注意,解析器中忽略的元素不会在 HtaccessContainer 序列化方法中可用。
贡献
请随意通过分叉或提出建议来贡献。
问题跟踪器:https://github.com/tivie/php-htaccess-parser/issues
源代码:https://github.com/tivie/php-htaccess-parser
许可证
PHP Htaccess Parser 在 Apache 2.0 许可证下发布。有关更多信息,请参阅此存储库中的 LICENSE 文件或 https://apache.ac.cn/licenses/LICENSE-2.0.txt。