我有一些具有这种结构的文件:
<?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”,但我没有以我正在寻找的结果结束。
感谢您的帮助,我将不胜感激。
答案 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,生成结果,然后在列表的其余部分重复此步骤。