修复未加引号的 PHP 数组键

2024-03-31

或者更确切地说“修复用作 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(使用前将#替换为@)

修复未加引号的 PHP 数组键 的相关文章

随机推荐

  • Java日历时间、分钟错误

    有人知道为什么 java util Caldendar 中的 MINUTE 方法返回错误的分钟吗 import java util Calendar public class Clock Instance fields private Ca
  • 使用 futures 和 Thread.sleep

    通过执行这个 scala 代码 我在控制台中没有任何输出 我真的不明白发生了什么 如果我删除Console println Console println OK gt 一切看起来都很好 如果我删除Thread sleep 2000 gt 一
  • 有没有好的、简单的用于进程间调用的 RPC 库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使 EditText 的父级可点击?

    假设我有这个粉红色的盒子 它包括LinearLayout和它的孩子们 TextView作为字段名称和EditText EditText被故意禁用 我想要的是 用户可以在粉红色的方框上单击任何用户想要的位置 顺便说一句 请忽略任何您觉得奇怪的
  • 是否可以从具有跨源数据的元素中捕获?

    我在 webRTC 文档中找到了这个简单的脚本 我尝试运行它 但似乎我遗漏了一些东西 const leftVideo document getElementById leftVideo const rightVideo document g
  • JIT - 将 Spacetree 保存为图像

    我正在使用 JavaScript InfoVis Toolkit http thejit org 并尝试将输出的 Spacetree 保存到图像中 空间树被输出到画布上 这个问题实在是让我很沮丧 我努力了 在新窗口中打开画布 在新窗口中打开
  • Windows 上 Haskell 中的 Unicode 控制台 I/O

    在 Windows 下的 Haskell 中让控制台 I O 与 Unicode 字符一起工作似乎相当困难 这是一个悲惨的故事 初步的 在考虑在 Windows 下的控制台中执行 Unicode I O 之前 您需要确保您使用的控制台字体可
  • 打开htaccess密码保护页面没有提示

    我在网站上有一个目录 该目录通过 htaccess 进行密码保护 我希望能够通过我的应用程序打开此网页 而无需用户输入密码 而是以编程方式打开此网页 例如 有没有办法可以将登录信息嵌入到 URL 中 例如http www mypage co
  • 如何在textarea中使用keydown事件?

    我不太习惯使用 javascript 但我已经厌倦了在工作中手动重复尝试 当我在论坛中写作时 我需要一个快速的简短命令 例如 Ctrl Alt z 来将一些文本插入到文本区域对象中 我已经编写了一个在文本光标 insertAtCursor
  • 在 XCode 中向表视图 (UITableView) 添加单元格

    我是 X Code 新手 刚刚开始开发我的第一个应用程序 我正在使用故事板 在导航控制器场景中 我添加了一个带有两个单元的 MasterViewController 这导致了两个 DetailViewController Detail1 和
  • 什么时候会使用没有 Arc 的互斥体?

    Rust 中一个极其常见的模式是Arc
  • 在 UITableViewCell 中进入编辑模式时隐藏 UITableViewCells(类似于联系人应用程序)

    有谁知道如何在进入编辑模式时隐藏分组 UITableView 中的多个单元格 我希望当退出编辑模式时 行能够以动画效果隐藏 如联系人应用程序中所示 如您所知 在联系人编辑模式下 行数比切换回正常模式时要多 我想知道如何顺利 切换 请注意 我
  • 结合多种功能

    我正在尝试制作一个 DNA 转录程序 但我的做法遇到了麻烦 我确信有一种更简单的方法可以做到这一点 但这是我想到的第一件事 但事实并非如此按照我想要的方式工作 dnaToRna Char gt Char dnaToRna dnaToRna
  • 使用 IntelliJ IDEA for JavaScript 的最佳插件和项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 MEAN 堆栈构建一个 Web 应用程序 MongoDB http www mongodb com Express htt
  • 处理子资源完整性检查中的加载错误

    我正在实施子资源完整性检查 我想实现一个回退 以便 1 浏览器从我的 CDN 加载 执行完整性检查并继续 或者 2 如果完整性检查失败 嵌入式脚本将启动并从我的应用程序检索所需的脚本服务器 我控制的资源 我有一个简单的 javascript
  • 列出特定 AMI 的所有可能的实例类型?

    我知道以前曾有人问过这个问题 但我尚未找到用于获取给定 Amazon AMI 的可能实例类型列表的解决方法或解决方案 我正在使用 NET SDK 有没有人能够找到一种方法来做到这一点 这不可能 AMI 只是磁盘的映像 AWS 通常 可以检测
  • C#,“未将对象引用设置为对象的实例。”错误

    我有这个代码 namespace YellowBox public partial class Form1 Form private string sid FileTransferManager fm new FileTransferMan
  • UpsetR 更改图表中的集名称标签

    我正在尝试将 UpsetR 图中的集合名称标签 使用 Upset 函数 更改为多个单词的字符串 我希望将集合标签显示为 A 描述 B 描述 C 描述 而不是 A B C 作为集合标签 我不想在单词之间使用句号或下划线 test lt ups
  • 有没有办法在 PHP4 中模拟 PHP5 的 __call() 魔术方法?

    PHP5有一个 神奇的方法 call 可以在调用未定义方法时调用的任何类上定义 它大致相当于 Ruby 的method missing或者 Perl 的AUTOLOAD 在旧版本的 PHP 中可以做这样的事情吗 我缺少的最重要的一点是 ca
  • 修复未加引号的 PHP 数组键

    或者更确切地说 修复用作 PHP 数组键的未加引号的字符串 但这对于标题来说有点长 我继承了一个相当大的代码库 其中数组的编写方式如下 array id 0 array value test 虽然这段代码实际上有效 但它抛出了很多Use o