方法(例如通过bash脚本)将当前使用常量的php数组索引转换为使用单引号字符串的数组索引


Method (e.g. via bash script) to turn php array indexes currently using constants into array indexes using single quoted strings?

我有一大堆php脚本,其中使用了大量常量来代替适当的单引号数组字符串。

例如:

$row_rsCatalogsItems[Name]

(坏的管理者)不是

$row_rsCatalogsItems['Name']

(好)

我如何创建一个脚本(bash, php,无论什么是最可用的),我可以在脚本上运行,将它们转换为更明智的方法?

理想情况下,它不仅匹配[某物],而且匹配$variable_name[someIndex]。

我实际上想知道它是否可行考虑到潜在的搞砸字符串或html的内部…(也许如果我只是使用单引号,这并不重要,因为它们无论如何都是内插的…)

这听起来像是Tokenizer的工作!

您可以使用token_get_all从PHP源文件中获取所有已解析的令牌。然后,您可以遍历结果数组,每次计算一个令牌。令牌名称返回为一个数字,您可以使用token_name查找。

在PHP交互提示符下的一个小演示:

php > $str = '<?php echo $face[fire]; echo $face[''fire'']; ?>';
php > $t = token_get_all($str);
php > foreach($t as $i => $j) { if(is_array($j)) $t[$i][0] = token_name($j[0]); }

这里是不同代码块的输出,因为它有点高,当滚动它时引用源字符串会很好。

php > print_r($t);
Array
(
    [0] => Array
        (
            [0] => T_OPEN_TAG
            [1] => <?php
            [2] => 1
        )
    [1] => Array
        (
            [0] => T_ECHO
            [1] => echo
            [2] => 1
        )
    [2] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )
    [3] => Array
        (
            [0] => T_VARIABLE
            [1] => $face
            [2] => 1
        )
    [4] => [
    [5] => Array
        (
            [0] => T_STRING
            [1] => fire
            [2] => 1
        )
    [6] => ]
    [7] => ;
    [8] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )
    [9] => Array
        (
            [0] => T_ECHO
            [1] => echo
            [2] => 1
        )
    [10] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )
    [11] => Array
        (
            [0] => T_VARIABLE
            [1] => $face
            [2] => 1
        )
    [12] => [
    [13] => Array
        (
            [0] => T_CONSTANT_ENCAPSED_STRING
            [1] => 'fire'
            [2] => 1
        )
    [14] => ]
    [15] => ;
    [16] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )
    [17] => Array
        (
            [0] => T_CLOSE_TAG
            [1] => ?>
            [2] => 1
        )
)

可以看到,我们的邪恶数组索引是一个T_VARIABLE后面跟着一个左括号,然后是一个T_STRING,它是而不是引号。单引号索引通过T_CONSTANT_ENCAPSED_STRING,引号和所有。

掌握了这些知识后,您就可以遍历令牌列表并实际重写源代码以消除所有未加引号的数组索引——其中大多数应该非常明显。当您将文件写出来时,您可以简单地在字符串周围添加单引号。

请记住,不要引用任何数字索引,因为这肯定会产生不良的副作用。

还要记住表达式在索引内部是合法的:

$pathological[ some_function('Oh gods', 'why me!?') . '4500' ] = 'Teh bad.';

您将有一个非常小的,用自动化工具处理这些稍微困难一些。我的意思是,试图处理它们可能会让你勃然大怒。我建议现在只尝试修复常量/字符串问题。如果操作正确,您应该能够将通知计数降低到更易于管理的水平。

(还请注意,Tokenizer将花括号字符串语法作为一个实际的标记T_CURLY_OPEN来处理——这应该使那些令人讨厌的内联数组索引更容易处理。下面是所有标记的列表,以防您错过。

这是我最终采用的方法,仅供参考:

所有公共的include (header, footer, sidebars)得到他们所有的通知被压缩,并接收提升的报告设置(例如,他们记录通知)。

旧的和有很多通知的主要内容已经被忽略,通知不显示/记录。

我编写的新主内容将具有提升的报告设置。

我还继承了遗留的PHP代码,并创建了一个简短的PHP脚本,它将获取源文件并替换未加引号的数组索引。它实际上做了查尔斯在另一个答案中建议的事情。

包含在注释中的是一个bash命令行脚本,它将在一个文件夹和子文件夹中的所有PHP源文件上调用数组索引修复器。

您可以在这里获得脚本的副本:

https://github.com/GustavBertram/php-array-index-fixer/blob/master/aif.php