在C#中快速解析PHP

我需要在C#中解析PHP文件。 我们基本上要求另一个国家的一些开发人员上传PHP文件,一旦上传,我们需要检查php文件并获取所有方法和类/函数等的列表。

我想过使用一个正则表达式,但如果一个函数属于一个类等我就无法进行锻炼,所以我想知道是否已经有了’那里’会解析PHP文件并吐出它的函数(我正在尝试避免写一个完整的AST实现)。

有谁有想法吗? 我看了Coco / R但是找不到PHP语法文件。 我正在使用.NET 2.0和C#。

为什么在C#中呢? 在PHP中,这是微不足道的。 使用token_get_all()函数,它会将PHP文件分解为一个词汇流,您可以通过编写有限状态机来确定类和方法列表。

无论你做什么,都不要尝试用正则表达式来做这件事。 这将是令人难以置信的乏味和容易出错。

编辑:执行此操作有三种基本可能性:

  1. 用PHP做。 这将是最快(开发)和最简单的选择;
  2. 运行命令行PHP脚本来执行此操作或生成一系列可由C#程序解释的标记。 这是下一个最容易的;
  3. 使用Phalanger ,PHP的端口到.Net框架。 这可能更适合管理,因为它仍然是所有.Net代码; 要么
  4. 使用Quercus ,PHP的端口到Java VM。

其他任何事情都将涉及编写PHP解析器(大量工作)或使用真正片状的正则表达式,这将是一个不可靠的支持噩梦。

关注PHP的假设“安全漏洞”有几个问题:

  1. 任何框架或技术堆栈都可能存在安全漏洞。 你的系统管理员只允许.Net在抗议Java的情况下有效地表明非理性偏见。 我说这是一个长期的Java开发人员:Java,.Net和PHP都有安全漏洞;
  2. 您可以从命令行运行PHP,因此它不会提供任何HTTP请求,从而将安全漏洞问题基本上减少为零;
  3. 如果您担心内部安全威胁(来自有权访问该框的人),只需将PHP CLI可执行文件限制为只能由您的程序所在的组执行。

您可以将ctags用于您的目的。 我不知道如何将它与C#集成,因为ctags是用C语言编写的。

或者,如果您了解解析器,则可以查看PHP源中的语法文件。 特别是zend_ini_parser.yzend_language_parser.y

最后,尽管不是最好的解决方案,但你可能还是可以通过家庭酿造的一些正则表达式来解决问题。 PHP的语法在类和函数方面相当严格。 你只需要跟踪一点状态,这样你就知道一个函数属于哪一个类。