0

0

如何安全地将点号分隔的字符串转换为多维数组(无需 eval)

聖光之護

聖光之護

发布时间:2026-01-28 21:51:03

|

862人浏览过

|

来源于php中文网

原创

如何安全地将点号分隔的字符串转换为多维数组(无需 eval)

本文介绍一种安全、高效且符合现代 php 最佳实践的方式,将形如 "slider.item1.headline1" 的字符串路径动态解析并赋值到嵌套数组中,完全规避 `eval()` 的安全风险与 ide 警告。

在 Symfony 项目中,常需从数据库读取模板变量(如 slider.item1.headline1 = "Headline1"),并在 Twig 模板中以嵌套结构访问(如 {{ slider.item1.headline1 }})。但原始数据是字符串形式的路径,无法直接作为数组键使用。传统做法(如 eval())不仅存在严重代码注入风险,还会被 PHPStorm 等工具标记为高危操作,并影响代码可维护性与静态分析准确性。

推荐解法是采用引用遍历 + 动态路径构建策略:

  • 初始化空数组 $myvar;
  • 对每个路径字符串(如 "slider.item1.headline1"),先清理非法字符(保留字母、数字、点和下划线),再按 . 分割为键序列;
  • 使用引用变量 $current 逐层深入数组,自动创建中间缺失的子数组;
  • 最终将值($tv['htmltext'])赋给最深层键。

以下是优化后的完整实现:

protected function convertTemplateVarsFromDatabase($tplvars): array
{
    $myvar = [];
    foreach ($tplvars as $tv) {
        // 清理路径:仅保留合法标识符字符,非法字符统一替换为下划线
        $handle = preg_replace('/[^a-zA-Z0-9._]/', '_', $tv['handle']);
        $keys = explode('.', $handle);

        // 使用引用逐层定位目标位置
        $current = &$myvar;
        foreach ($keys as $key) {
            // 若当前层级不存在该键,则初始化为空数组(确保可继续嵌套)
            if (!isset($current[$key])) {
                $current[$key] = [];
            }
            // 移动引用至下一层
            $current = &$current[$key];
        }

        // 将实际值写入最终位置(覆盖原空数组)
        $current = $tv['htmltext'];
    }

    return $myvar;
}

优势说明

PictoGraphic
PictoGraphic

AI驱动的矢量插图库和插图生成平台

下载
  • 零 eval:彻底消除远程代码执行(RCE)隐患,符合 PSR-12 与 Symfony 安全规范;
  • 类型安全:全程强类型数组操作,兼容 PHP 7.4+ 类型声明与静态分析工具;
  • 健壮容错:自动处理任意深度嵌套(如 a.b.c.d.e),支持重复路径覆盖;
  • 性能友好:时间复杂度 O(n×m),其中 n 为变量数,m 为平均路径长度,无正则回溯或字符串拼接开销。

⚠️ 注意事项

  • 若业务允许用户输入 handle 字段,请额外校验其长度与语义(例如禁止纯数字键、限制最大嵌套深度),防止 DoS 类攻击(如超长路径耗尽内存);
  • 若需支持对象属性访问(如 obj->prop),本方案不适用——应改用 property_exists() + Reflection 或专用表达式解析器(如 Symfony ExpressionLanguage);
  • 在 Twig 中使用时,确保返回数组已正确传递至模板上下文(如通过 return $this->render('template.html.twig', ['data' => $myvar]);)。

该方法已在生产级 Symfony 应用中稳定运行,兼顾安全性、可读性与扩展性,是替代 eval() 解析动态路径的标准实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

78

2025.09.11

phpstorm怎么导出项目
phpstorm怎么导出项目

phpstorm提供导出项目功能,步骤如下:打开phpstorm项目转到“项目”菜单选择“导出项目”选择导出格式指定导出位置选择导出范围勾选“包括依赖项”框(可选)单击“导出”完成导出。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

363

2024.04.08

phpStorm怎么运行
phpStorm怎么运行

本专题整合了phpstorm运行教程,阅读专题下面的文章了解更多相关内容。

85

2025.09.18

phpstorm开发环境搭建教程
phpstorm开发环境搭建教程

本专题整合了phpstorm开发环境搭建和运行项目教程,阅读专题下面的文章了解更多详细教程。

76

2025.09.18

phpstorm怎样运行php
phpstorm怎样运行php

本专题整合了phpstorm运行php相关教程,阅读专题下面的文章了解更多详细内容。

62

2025.09.18

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

12

2026.01.15

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号