使用PHP tokenizer查找函数

时间:2012-01-29 14:30:43

标签: php static-analysis

现在,我有一个脚本,它使用PHP的tokenizer来查找PHP源代码文件中的某些函数。我目前正在寻找的模式是:

T_STRING + T_WHITESPACE(可选)+“(”

这似乎与我的所有测试用例相匹配,除了变量函数,我忽略了这个问题。

这里显而易见的问题是这种模式会产生很多误报,比如匹配函数定义:

public function foo() {  // foo() should not be matched

我的问题是,是否有更可靠/准确的方法来查看源代码并提取所有函数调用?也许比使用tokenizer更好的方法?

修改

特别是,我希望在类文件中模拟disable_functions PHP指令的功能。因此,如果不允许exec(),我试图在分析的文件中找到该函数的任何用法。我确实意识到变量函数使得这非常困难,所以我正在检测它们并禁止它们。

2 个答案:

答案 0 :(得分:0)

首先运行tokenizer(在PHP中可用)。然后在令牌之上运行解析器。解析器需要读取令牌,并且应该能够告诉您特定令牌的用途。这取决于解析器的可靠性结果的可靠性。

如果您当前的解析器(您没有显示任何代码)不够可靠,则需要编写更好的解析器。这很简单。可能你做的不仅仅是标记,然后阅读,因为它通过了可能还不够。

答案 1 :(得分:0)

而不是使用tokenizer,而是考虑使用更高级别的解析器来分析代码。例如,PHP-Parser可以显式标识函数声明,以及变量函数调用。