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

时间:2011-04-12 22:43:32

标签: php bash scripting code-cleanup

我有大量的PHP脚本,其中使用了许多常量来代替正确的单引号数组字符串。

例如:

$row_rsCatalogsItems[Name]

(坏)

而不是

$row_rsCatalogsItems['Name']

(好)

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

理想情况下,它不仅匹配[something],还会匹配$ variable_name [someIndex]。

我真的想知道它是否可行,考虑到搞乱字符串或html内部的可能性......(也许如果我只使用单引号,它无关紧要,因为它们无论如何都是插值的...... )

3 个答案:

答案 0 :(得分:2)

这听起来像是Tokenizer的工作!

您可以使用token_get_all从PHP源文件中获取所有已解析的标记。然后,您可以一次查看生成的数组evaluating each token。令牌名称返回为您可以使用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处理 - 这应该使那些讨厌的内联数组索引更容易处理。Here's the list of all tokens once again, just in case you missed it。)

答案 1 :(得分:0)

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

所有commmon包括(页眉,页脚,侧边栏)将所有通知压缩,并接收提升的报告设置(例如,他们记录通知)。

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

我编写的新主要内容会提升报告设置。

答案 2 :(得分:0)

我还继承了遗留的PHP代码,我创建了一个简短的PHP脚本,它将获取源文件,并替换不带引号的数组索引。它基本上做了Charles在另一个答案中建议的内容。

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

您可以在此处获取该脚本的副本:

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