token_get_all,回到php源码,怎么样?

时间:2015-07-02 11:11:36

标签: php

我想分析源代码(使用token_get_all())进行一些修改(例如,将所有private转为public,摆脱final等) ,并保存源代码,但保持相同的格式,制表符等。有没有办法,这样做?

3 个答案:

答案 0 :(得分:2)

我制作了这段代码:

private static function convertSourceCodeToTestable ($sourceCodePath)
{
    $newCode = '';
    foreach (token_get_all(file_get_contents($sourceCodePath)) as $item)
    {
        if (is_array($item))
        {
            switch ($item[0])
            {
                case T_FINAL :
                case T_STATIC :
                    $item[1] = '';
                    break;
                case T_PRIVATE :
                case T_PROTECTED :
                    $item[1] = 'public';
                    break;
            }
            $item = $item[1];
        }
        $newCode.= $item;
    }
    return $newCode;
}

这看起来像我想要的那样,不会搞砸代码

答案 1 :(得分:1)

没有。在进行词法分析时,格式很大*会消失。它与逻辑结构无关,也没有保留。您可以根据自己喜欢的格式规则将这些令牌重新格式化为新的源代码,但不能以这种方式保留原始源格式。

*已经解析并返回了T_WHITESPACE令牌,但是在所有情况下它看起来都不会变成令牌,所以你可能至少会丢失一些。

如果您想要这样做,您必须编写自己的tokeniser / parser并记住格式,或者您需要以某种方式将您的更改反向设计为源代码并修改原始文件直接(听起来像疯了,IMO)。

答案 2 :(得分:1)

您可以使用标记中的值来生成新文件。无需格式化。只需将它们缝在一起成为一个字符串,然后将其保存到文件中即可。只要确保使用is_string()来识别令牌是数组还是字符串即可。