在数百个文件中修改php数组元素的脚本


Script to modify php array elements in hundreds of files

我正在筛选一些严重弃用的PHP代码。我遇到的问题之一是数百个这样的错误:

[Mon Dec 09 07:00:33 2013] [error] [client 127.0.0.1] PHP Notice: Use of undefined constant id - assumed 'id' in /home/srv/site.local/content/online.php on line 171, referer: http://site.local/index.php

这导致了以前的编码器调用数组的做法,比如:

$array[some_element]

而不是:

$array['some_element']

所以我知道如何通过浏览每个文件并添加引号来解决这个问题,一遍又一遍。我的问题是如何写这个脚本。我想这可能是sed或awk脚本,但我不确定。我会在发布完这篇文章后立即开始做sed,但有什么建议吗?

我对php一无所知,所以我不确定这个解决方案是否特别好:

sed  "s|'[[ ]*|'[''|g;s|[ ]*']|''']|g" test.in

使用示例:

[fixarraysubscript $] cat test.in
$array[some_element]
$name1[index]
$name2[index]

$name3[ id ]
$name4[ id2 ]
[fixarraysubscript $]
[fixarraysubscript $] sed  "s|'[[ ]*|'[''|g;s|[ ]*']|''']|g" test.in
$array['some_element']
$name1['index']
$name2['index']

$name3['id']
$name4['id2']
[fixarraysubscript $]

显然,我的输入文件有些做作。如果这对你不起作用,请随意发表一些真实的意见。

这可能适用于gnu awk

echo '$array[some_element]' | awk '{print gensub(/'$([^[]+)'[([^]]+)]/,"$''1["q"''2"q"]","g")}' q="'"
$array['some_element']

对于您的文件

awk '{print gensub(/'$([^[]+)'[([^]]+)]/,"$''1["q"''2"q"]","g")}' q="'" file

awk '{print gensub(/'$([^[]+)'[([^]]+)]/,"$''1['x27''2'x27]","g")}' file

EDIT:已更改regex以反映变量数组名称。