1

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

<?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”。

注意:我不解析开关($_GET['section'])。我只是想提取 switch($_GET['action']) 的情况。

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

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

4

1 回答 1

0

为此,您可能需要一个完整的 PHP 解析器,它构建了相当于 AST 的内容。

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

如果您想编写自己的 PHP 解析器,token_get_all 是一个起点。这可能比您想象的要付出更多的努力;语言很复杂,没有很好的记录。

PHP中有一个PHP解析器,使用token_get_all编码;见http://github.com/nikic/PHP-Parser。我不知道它有多强大。我在这里与写它的人进行了互动,他似乎足够聪明。它声称它不会详细解析表达式,但您似乎不需要更多。您将通过爬上爬下他定义的任何语法树来编写搜索开关和案例的代码。【其实你可以表达内容,如果你想对switch表达式的内容进行区分】。

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

       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_target 绑定到您要打印的值,并将 \rest_of_cases 绑定到案例列表的其余部分。您可以使用 out 工具打印绑定的 \case_target,生成结果,然后在列表的其余部分重复此步骤。

于 2013-06-21T00:12:46.180 回答