首页 > 解决方案 > 正则表达式 PHP 函数

问题描述

是的,我知道人们不喜欢解析 PHP,使用他们说的分词器,他们说的会很棒......我想让你知道它不是很好,甚至都不是很好。

我在 .NET 中工作并使用 PCRE-NET,想解析一些 PHP 函数,看看我是否可以做一些 PHP 摇树。

我尝试使用CodeParserwhich uses Antlr4to tokenize,我得到的结果很难导航。是的,从技术上讲,一切都在那里,但它是如此令人费解,以至于 Regex 更适合我正在寻找的东西。

我有以下正则表达式工作:

(?<functionScope>\w+)\s*function\s+(?<functionName>\w+)\s*\((?<functionArguments>(?:[^()]+)*)?\s*\)[\s:]*.*(?<functionBody>{(?:[^{}]+|(?-1))*+})

试试看:https ://regex101.com/r/yU6K45/1

这会将 PHP 文件分解为单独的作用域、函数、参数和函数体。我现在正在查看functionBody并希望找到该函数中使用的所有函数,我在这里:

(?=[^\=\s])((?<functionClass>[$?\w[\w\d]*)?(?<ClassOperator>::|->|\\)?){0,3}?(?<functionName>\w[\w\d]*)\((?<Arguments>.*)?\)

请参阅:https ://regex101.com/r/3JzPR5/1

我遇到的一个问题是命名组。当有很多命名空间时,命名组不能很好地工作。我想知道您是否有任何想法如何拆分线路:

  $uri = ExtraLevel\Psr7\UriResolver::resolve(Psr7\Utils::uriFor($config['base_uri']), $uri);

到哪里我会有类似的东西:

Full match               ExtraLevel\Psr7\UriResolver::resolve(Psr7\Utils::uriFor($config['base_uri']), $uri)
Group `functionClass`    ExtraLevel\
Group `functionClass2`   Psr7\
Group `functionClass3`   UriResolver::
Group `functionName`     resolve
Group `Arguments`        Psr7\Utils::uriFor($config['base_uri']), $uri

当没有 3-4 个级别时,希望以一种不会中断的方式进行匹配。

标签: phpregextokenize

解决方案


推荐阅读