robinbressan/regex-parser

PCRE 正则表达式的 AST

dev-master 2015-11-03 10:51 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:08:26 UTC


README

RegexParser 是 PCRE 正则表达式的解析器。它生成一个 AST,表示您的正则表达式。它可以帮助您生成一些与您的正则表达式匹配的输入。

安装

它可以通过 Composer 获取。

composer install robinbressan/regex-parser

用法

要构建一个 AST,您需要创建一个解析器

$parser = \RegexParser\Parser\Parser::create();

$ast = $parser->parse('YOUR_REGEX');

现在您可以使用格式化工具将 AST 转换为几种格式(目前仅支持 XML)

$formatter = new \RegexParser\Parser\Formatter\XMLFormatter();

$xml = $formatter->format($ast); // $xml is now an instance of DOMDocument

如果您愿意,可以轻松显示它

$xml->formatOutput = true;
echo $xml->saveXML();

因为您可以获取 DOMDocument,所以您可以使用 XPath 引擎来查询您的 AST。

示例

正则表达式 ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$ 将生成以下 AST

<?xml version="1.0" encoding="utf-8"?>
<ast>
  <begin>
    <repetition min="1">
      <block sub-pattern="false">
        <token type="underscore">_</token>
        <character-class>
          <token type="char">a</token>
          <token type="char">z</token>
        </character-class>
        <character-class>
          <token type="integer">0</token>
          <token type="integer">9</token>
        </character-class>
        <token type="minus">-</token>
      </block>
    </repetition>
  </begin>
  <repetition min="0">
    <block sub-pattern="true">
      <token type="char">.</token>
      <repetition min="1">
        <block sub-pattern="false">
          <token type="underscore">_</token>
          <character-class>
            <token type="char">a</token>
            <token type="char">z</token>
          </character-class>
          <character-class>
            <token type="integer">0</token>
            <token type="integer">9</token>
          </character-class>
          <token type="minus">-</token>
        </block>
      </repetition>
    </block>
  </repetition>
  <token type="at">@</token>
  <repetition min="1">
    <block sub-pattern="false">
      <character-class>
        <token type="char">a</token>
        <token type="char">z</token>
      </character-class>
      <character-class>
        <token type="integer">0</token>
        <token type="integer">9</token>
      </character-class>
      <token type="minus">-</token>
    </block>
  </repetition>
  <repetition min="0">
    <block sub-pattern="true">
      <token type="char">.</token>
      <repetition min="1">
        <block sub-pattern="false">
          <character-class>
            <token type="char">a</token>
            <token type="char">z</token>
          </character-class>
          <character-class>
            <token type="integer">0</token>
            <token type="integer">9</token>
          </character-class>
          <token type="minus">-</token>
        </block>
      </repetition>
    </block>
  </repetition>
  <end>
    <block sub-pattern="true">
      <token type="char">.</token>
      <repetition min="2" max="4">
        <block sub-pattern="false">
          <character-class>
            <token type="char">a</token>
            <token type="char">z</token>
          </character-class>
        </block>
      </repetition>
    </block>
  </end>
</ast>

生成器

您也可以根据您的 AST 创建一个生成器,该生成器将生成一个与您的正则表达式匹配的字符串

$generator = new \RegexParser\Generator\RandomGenerator($ast);
$generator->generate($seed = null);

如果您愿意,也可以直接创建生成器

$generator = new \RegexParser\Generator\RandomGenerator::create('YOUR_REGEX');
$generator->generate($seed = null);

测试

要运行测试,您必须运行 phpunit 命令。

贡献

所有贡献都受欢迎。如果您添加了一个新功能,请确保所有测试都通过!

许可证

此应用程序可在 MIT 许可证下使用。