token_get_all,返回php源码,怎么做?

3lxsmp7m  于 2023-11-16  发布在  PHP
关注(0)|答案(4)|浏览(102)

我想分析一个源代码(与token_get_all())做一些修改(例如,把所有的privatepublic,摆脱final等),并保存源代码,但保持相同的格式,制表符等,有什么办法,做到这一点?

fcwjkofz

fcwjkofz1#

我做了这个代码:

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;
}

字符串
这看起来做我想要的,不会弄乱代码

slwdgvem

slwdgvem2#

您可以使用token中的值生成新文件。不需要格式化。只需将它们缝合到一个字符串中并将其保存到文件中。请确保使用is_string()来识别token是数组还是字符串。

3z6pesqy

3z6pesqy3#

我想分析一个源代码[...]做一些修改(例如,把所有私有的变成公共的,去掉final等
太好了,我们有这样做的工具。
(with token_get_all())中的所有值
https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
您更希望使用https://github.com/nikic/PHP-Parser
并保存源代码
这确实是nikic/PHP解析器的一个特性。

use PhpParser\ParserFactory;
use PhpParser\PrettyPrinter;

$parser = (new ParserFactory())->createForNewestSupportedVersion();
$ast = $parser->parse($code);
// manipulate the AST
...
// print it
$prettyPrinter = new PrettyPrinter\Standard;
echo $prettyPrinter->prettyPrintFile($ast);

字符串
但是保持相同的格式、制表符等。有什么方法可以做到这一点吗?
格式设置基本上会丢失。如果在此之前保持为编码标准,则可以使用https://phpqa.io/projects/phpcbf.html来恢复标准格式的代码。某些注解可能会丢失,请参阅https://github.com/nikic/PHP-Parser/issues/762

w46czmvw

w46czmvw4#

不会。在进行词法分析时,标记 * 基本上会被排除在外。它与逻辑结构无关,不会被保留。您可以根据自己喜欢的格式规则将这些标记重新格式化为新的源代码,但无法以这种方式保留原始源代码格式。

  • 有一个T_WHITESPACE标记被解析并返回,但是看起来并不是所有的空格在所有情况下都变成标记,所以你可能会丢失一些。

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

相关问题