1

我有一大堆 php 脚本,其中有很多常量被用来代替正确的单引号数组字符串。

例如:

$row_rsCatalogsItems[Name]

(坏的)

代替

$row_rsCatalogsItems['Name']

(好的)

我将如何创建一个可以在脚本上运行的脚本(bash、php 等最有用的)以将它们转换为更明智的方法?

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

我实际上想知道考虑到可能会搞砸字符串或 html 的内部是否可行......(也许如果我只使用单引号,那没关系,因为它们无论如何都会被插值......)

4

3 回答 3

2

这听起来像是Tokenizer的工作!

您可以使用token_get_all. 然后,您可以遍历生成的数组,一次评估每个令牌。令牌名称以数字形式返回,您可以使用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
        )

)

如您所见,我们的邪恶数组索引是 aT_VARIABLE后跟一个左括号,然后T_STRING引用的 a。单引号索引来自 as T_CONSTANT_ENCAPSED_STRING,引号和所有。

掌握了这些知识,您可以浏览标记列表并实际重写源代码以消除所有未引用的数组索引——它们中的大多数应该非常明显。当您写回文件时,您可以简单地在字符串周围添加单引号。

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

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

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

使用自动化工具处理这些问题会稍微困难一些。我的意思是试图处理它们可能会导致你陷入杀气腾腾的愤怒。我建议现在只尝试修复常量/字符串问题。如果操作正确,您应该能够将通知倒计时降低到更易于管理的水平。

(另请注意,Tokenizer 将卷曲字符串语法作为实际标记处理,T_CURLY_OPEN——这应该使那些讨厌的内联数组索引更容易处理。这里再次列出所有标记,以防你错过它。)

于 2011-04-12T23:06:19.770 回答
0

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

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

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

我编写的新主要内容将具有更高的报告设置。

于 2011-07-14T14:27:37.427 回答
0

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

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

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

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

于 2012-11-22T10:05:23.730 回答