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


Parse PHP source codes and extract some informations

我有一些这样结构的文件:

<?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'])"的"case"。在本例中为"Step1", "step2"answers"step3"。

N。B:我不解析开关($_GET['section'])。我只是想提取switch($_GET['action'])的案例。

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

谢谢你的帮助,我会很感激的。

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

然后你可以遍历AST,找到switch语句,通过编写挑剔的过程代码来检查节点,上下爬树等,检查引用包含$_GET['ACTION']的子树的语句,挑选案例并最终打印它们,实现你的目标。

如果您想编写自己的PHP解析器,可以从

token_get_all开始。这可能比你想象的要付出更多的努力;语言很复杂,没有很好的文档。

PHP中有一个PHP解析器,使用token_get_all;见http://github.com/nikic/PHP-Parser。我不知道它有多强壮;我在SO和写这篇文章的人交流过,他看起来很聪明。它声称它不会详细解析表达式,但您似乎不需要更多。您将通过上下爬上他定义的语法树来编写搜索switch和case的代码。实际上,如果你想区别对待内容,你可以使用表达内容

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

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

您可以要求我们的工具为您找到匹配此模式的ast,并将子树绑定到head子句("cases")中列出的模式变量,并在模式主体("'cases")中用作占位符。绑定了'cases后,您可以匹配到另一个模式:

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

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