josefglatz/htaccess-parser

PHP 实现的 .htaccess 解析器和验证器

dev-main 2023-09-12 04:44 UTC

This package is auto-updated.

Last update: 2024-09-12 06:52:12 UTC


README

Build Status Latest Stable Version License SensioLabsInsight

轻量级的 PHP htaccess 解析器

简介

PHP Htaccess 解析器是一个小型轻量级的库,可以解析(或标记,如果您喜欢)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 解析器非常简单。

$file = new \SplFileObject('path/to/.htaccess');
$parser = new \Tivie\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 = new \Tivie\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);

扩展解析器

Parser类提供了开发者可以重写的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

为了输出.txt的.htaccess文件,您可以把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