【问题标题】:token_get_all, back to php source, how to?token_get_all,回到php源码,怎么做?
【发布时间】:2015-09-19 21:19:05
【问题描述】:

我想分析一个源代码(带有token_get_all())进行一些修改(例如,将所有private变成public,去掉final等),并保存源代码但保留相同的格式、制表符等。有什么办法吗?

【问题讨论】:

  • 你的问题是……?
  • 我得到一个数组。如何将其转回源代码?

标签: php


【解决方案1】:

您可以使用标记中的值生成新文件。无需格式化。只需将它们拼接成一个字符串并将其保存到一个文件中。请务必使用 is_string() 来识别令牌是数组还是字符串。

【讨论】:

    【解决方案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;
    }
    

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

    【讨论】:

      【解决方案3】:

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

      * 解析并返回了 T_WHITESPACE 标记,但看起来并非所有空格在所有情况下都会变成标记,因此您可能至少会丢失一些。

      如果您想这样做,您要么必须编写自己的标记器/解析器,它也会记住格式,或者您需要以某种方式将您的更改逆向工程到源代码并直接修改原始文件(这听起来很疯狂,IMO)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 2015-09-04
        • 2012-08-02
        相关资源
        最近更新 更多