或者更确切地说“修复用作 PHP 数组键的未加引号的字符串”,但这对于标题来说有点长。
我继承了一个相当大的代码库,其中数组的编写方式如下:
$array[id] = 0;
$array[value] = "test"
虽然这段代码实际上有效,但它抛出了很多Use of undefined constant
通知,所以这些行确实需要变成:
$array['id'] = 0;
$array['value'] = "test"
我们谈论的是分布在几千个文件中的数十万行代码。
还有这样的情况:
$_SESSION[user_information][access_bit][ACCESS_NULL] = 1;
Where user_information
and 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]
to $user['id']
。它留下多维数组,例如$user[data][id]
to $user['data'][id]
。我故意不匹配大写键,因为它们很可能是定义的常量。
第二preg_replace
只需匹配前一个键的右括号即可作用于所有后续键。
这可能不是最优雅的解决方案,但它似乎完成了工作。我现在正在检查过去一小时的差异,但找不到任何失败的地方。
附:这PHP 分词器 http://php.net/manual/en/function.token-get-all.php此任务失败,因为它似乎还将未定义的常量转换为字符串,并且它们被标记为T_STRING
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)