我有一大堆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