php - 修复未加引号的 PHP 数组键

标签 php arrays constants find-replace

或者更确切地说“修复用作 PHP 数组键的未加引号的字符串”,但这对于标题来说有点长。

我继承了一个相当大的代码库,其中数组的编写方式如下:

$array[id] = 0;
$array[value] = "test"

虽然这段代码确实有效,但它抛出了很多使用未定义常量通知,因此这些行确实需要变为:

$array['id'] = 0;
$array['value'] = "test"

我们正在谈论分布在几千个文件中的数十万行代码。

还有这样的情况:

$_SESSION[user_information][access_bit][ACCESS_NULL] = 1;

其中user_informationaccess_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/

相关文章:

php - ACL ROLE_ADMIN 不起作用

c - 如何使用 C 测量 L1、L2 和 L3 缓存延迟?

将 C#define 常量转换为变量

c - 如何在通用排序函数中添加排序顺序选项

python - 如何填充 numpy 数组而不填充角落?

string - 尝试声明一个 String const 结果为预期类型,发现 "my string"

c++ - C++ 中 const 变量成员有什么用?

php - php时区会一直存在吗?

php - 通过 $_GET 传递外键

php - 我用什么查询在服务器端导出mysql中的记录