解析PHP源代码并提取一些信息

时间:2013-06-20 23:46:58

标签: php parsing

我有一些具有这种结构的文件:

<?php
    echo "something";

    switch($_GET['action'])
    {
         case 'step1':
           echo 'somethings';
         break;

         case 'step2':
           echo 'somethings';
           switch($_GET['section'])
           {
               case 'section1':
                  echo 'somethings';
               break;
           }
         break;

         case 'step3':
           echo 'somethings';
         break;

    }
?>

在我的BackOffice中,我想解析这些文件并为每个文件显示“switch($ _ GET ['action'])”的“案例”。在这个例子中,它将是“Step1”,“step2”和“step3”。

N.B:我不解析开关($ _ GET ['section'])。我只想提取开关的情况($ _ GET ['action'])。

我尝试了“token_get_all”,但我没有以我正在寻找的结果结束。

感谢您的帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

要做到这一点,你可能需要一个完整的PHP解析器,它可以构建相当于AST的内容。

然后,您可以遍历AST,找到switch语句,通过编写挑剔的程序代码来检查节点,爬上树和树丛等,检查引用包含$ _GET ['ACTION']的子树的那些语句。 ,挑出案例,最后打印出来,实现目标。

如果你想编写自己的PHP解析器,那么<​​p> token_get_all是一个可以开始的地方。这可能比你想象的要多得多;语言很复杂,没有很好的记录。

PHP中有一个PHP解析器,使用token_get_all编码;见http://github.com/nikic/PHP-Parser。我不知道它有多强大;我在这里和那个写作的人进行过互动,看起来很聪明。它声称它不会详细解析表达式,但您似乎不需要更多。您可以通过上下键入他定义的语法树来编写搜索开关和案例的代码。 [实际上,如果你想区分内容,你可以表达内容 切换表达式]。

如果你想要一个更复杂的PHP解析器,一个经过火测试的表达式,在令人难以忍受的细节中做表达,这是为了完成这些类型的任务,你可以要求更多的细节,我会告诉你我们的商业版本。 [我在这里放了一个链接,所以你可以在没有这种舞蹈的情况下找到它,但是有些SO主持人不喜欢这样,所以你必须要问]。我们还允许您根据表面语法定义模式,例如

       pattern targeted_switches(cases:case_clauses)=
            "   switch($_GET['ACTION']){ \cases } ";

您可以要求我们的工具为您找到与此模式匹配的AST,并将子树绑定到head子句(“cases”)中列出的模式变量,并在模式体(“\ cases”)中用作占位符。对于绑定的案例,您可以匹配另一种模式:

      pattern  cases(case_target:expression, s: statement,rest_of_cases:case_clauses)=
            "   case \case_target: \s \rest_of_cases ";

将在“\ cases”列表中找到第一个案例,将\ case_target绑定到要打印的值,并将\ rest_of_cases绑定到案例列表的其余部分。您可以使用工具打印绑定的\ case_target,生成结果,然后在列表的其余部分重复此步骤。