或者更确切地说“修复用作 PHP 数组键的未加引号的字符串”,但这对于标题来说有点长。
我继承了一个相当大的代码库,其中数组的编写方式如下:
$array[id] = 0;
$array[value] = "test"
虽然这段代码确实有效,但它抛出了很多使用未定义常量
通知,因此这些行确实需要变为:
$array['id'] = 0;
$array['value'] = "test"
我们正在谈论分布在几千个文件中的数十万行代码。
还有这样的情况:
$_SESSION[user_information][access_bit][ACCESS_NULL] = 1;
其中user_information
和access_bit
是字符串,ACCESS_NULL
是一个定义的常量。好处是常量仅以大写形式定义。
为了让事情变得更有趣,我们还在相同的 php 文件中添加了 javascript,其中像 array[id] = 0;
这样的代码完全没问题。
我想有效地清理这个困惑,并将所有这些未定义的常量用单引号括起来,但我不确定简单的查找/替换(即使使用正则表达式)是否可以做到这一点。有什么想法吗?
最佳答案
结果比我想象的要容易。
function fix_unquoted_array_keys($filename){
if(!is_file($filename)){
return "File not found!";
}
$content = file_get_contents($filename);
$content = preg_replace('/^!|\$([a-zA-Z_]+)\[([a-z_]+)\]/','\$$1[\'$2\']',$content);
$content = preg_replace('/\]\[([a-z_]+)\]/','][\'$1\']',$content);
file_put_contents($filename,$content);
// Check the file just in case we break something.
@exec("php -l ".$filename." 2>&1",$syntax);
if($syntax[0] && strpos($syntax[0],"No syntax errors") === false){
return $syntax[0];
}
return "OK";
}
第一个 preg_replace
将所有简单数组(例如 $user[id]
)替换为 $user['id']
。它将多维数组(例如 $user[data][id]
)保留为 $user['data'][id]
。我故意不匹配大写键,因为它们很可能是定义的常量。
第二个 preg_replace
通过简单地匹配前一个键的右括号来作用于所有后续键。
这可能不是最优雅的解决方案,但似乎它完成了工作。我现在正在检查过去一小时的差异,但找不到任何失败的地方。
附注PHP tokenizer此任务失败,因为它似乎还将未定义的常量转换为字符串,并且它们被标记为 T_STRING
。
关于php - 修复未加引号的 PHP 数组键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744912/