PHP-CS-Fixer `ereg_to_preg` 规则详解:将废弃的 ereg 系列正则函数安全迁移到 PCRE
开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载导读ereg_to_preg是 PHP-CS-Fixer 中一条用于将 PHP 5.3 之前引入、早已废弃的 POSIX 风格正则函数ereg、eregi、ereg_replace、eregi_replace、split、spliti自动改写为 PCRE 风格函数preg_match、preg_replace、preg_split的修复规则。本文基于该规则在 PHP-CS-Fixer 仓库中的官方文档、Fixer 源码与测试用例完整讲解它转换的函数映射、定界符选择策略、D修饰符的语义、风险边界以及启用方式帮助你安全地在存量代码库中完成这次现代化迁移。规则概述一条解决废弃函数迁移的 Risky 规则PHP 自 5.3.0 起将ereg系列函数标记为废弃并在 PHP 7.0 中彻底移除ext/ereg扩展被删除。任何运行在现代 PHP 版本上的历史代码只要还调用ereg、split等函数都会直接触发致命错误。ereg_to_preg规则的目标就是自动把这些调用替换为等价的preg系列函数调用让旧代码可以在新版本 PHP 上继续运行。在 PHP-CS-Fixer 的规则文档 doc/rules/alias/ereg_to_preg.rst 中该规则被定义为Replace deprecatederegregular expression functions withpreg.同时文档明确标注了一条WarningThis rule isRISKY— Risky if theeregfunction is overridden.也就是说如果项目代码中通过function ereg(...)自行定义覆盖了与ereg同名的函数或者通过命名空间use导入了同名函数那么这条规则的重写会改变程序的实际行为因此它被归类为 Risky 规则默认不会被普通的非 Risky 规则集启用。函数映射表六个旧函数 → 三个 PCRE 函数从 Fixer 源码 src/Fixer/Alias/EregToPregFixer.php 可以看到规则内部维护了一张完整的映射表FUNCTIONS常量这也是整条规则转换行为的事实基础旧函数POSIX 正则已移除新函数PCRE追加修饰符语义对应ereg($pattern, $subject)preg_match无匹配大小写敏感eregi($pattern, $subject)preg_matchi匹配大小写不敏感ereg_replace($pattern, $replacement, $subject)preg_replace无替换大小写敏感eregi_replace($pattern, $replacement, $subject)preg_replacei替换大小写不敏感split($pattern, $subject)preg_split无分割大小写敏感spliti($pattern, $subject)preg_spliti分割大小写不敏感映射逻辑非常直观大小写不敏感的i变体eregi、eregi_replace、spliti会被转换为其对应 PCRE 函数并在模式末尾追加i修饰符从而保留原有的不区分大小写语义参数顺序在两个函数族之间保持完全一致模式在前、subject 在后*_replace的 replacement 位置也一致因此转换是机械且一一对应的。关键设计自动追加D修饰符在 applyFix 方法 中构造 PCRE 模式时使用了$preg $delim.addcslashes($string, $delim).$delim.D.$map[2];即在模式闭合定界符之后、原有映射修饰符i之前固定追加D修饰符。这是本次迁移中非常关键的一个语义对齐点POSIX 的ereg语义中$只匹配字符串的绝对末尾PCRE 默认情况下$除了匹配末尾外还会匹配末尾换行符之前的位置追加D修饰符后PCRE 的$被限制为只匹配字符串最末尾从而与旧ereg的行为保持一致避免引入微妙的匹配结果差异。这也是为什么示例输出是/[A-Z]/D而不是简单的/[A-Z]/的原因。转换示例规则文档 doc/rules/alias/ereg_to_preg.rst 给出了官方示例--- Original New -?php $x ereg([A-Z]); ?php $x preg_match(/[A-Z]/D);测试用例 tests/Fixer/Alias/EregToPregFixerTest.php 则提供了远比文档更丰富的行为样本可以看作官方承诺的完整行为契约// eregi → preg_match i 修饰符 ?php $x preg_match(/[A-Z]/Di, $m); // 来自 eregi([A-Z], $m) // ereg_replace → preg_replace ?php $x preg_replace(/[A-Z]/D, , $m); // 来自 ereg_replace([A-Z], , $m) // eregi_replace → preg_replace i ?php $x preg_replace(/[A-Z]/Di, , $m); // 来自 eregi_replace([A-Z], , $m) // split → preg_split ?php $x preg_split(/[A-Z]/D, $m); // 来自 split([A-Z], $m) // spliti → preg_split i ?php $x preg_split(/[A-Z]/Di, $m); // 来自 spliti([A-Z], $m) // 二进制字符串前缀 b/B 会被原样保留 ?php $x preg_split(b/[A-Z]/Di, $m); // 来自 spliti(b[A-Z], $m) ?php $x preg_split(B/[A-Z]/Di, $m); // 来自 spliti(B[A-Z], $m)定界符选择策略最小转义优先PCRE 要求模式必须被一对定界符包围文档默认推荐/也支持#、!等。由于旧ereg模式中不含任何定界符转换时必须为每个模式挑选一个不会与模式内容冲突的定界符。Fixer 源码通过 getBestDelimiter 方法 实现了最小转义优先策略候选定界符按偏好顺序排列/、#、!见 DELIMITERS 常量依次检查模式字符串中是否包含该字符只要找到第一个未在模式中出现的定界符立即选用它——这样模式内容完全无需转义如果三个候选定界符都出现在模式中则统计各定界符在模式中的出现次数选择出现次数最少者次数相同时按候选顺序取前者并把选中的定界符在模式内通过addcslashes全部转义。测试用例对这一策略给出了直观验证// 模式含 /自动改用 # 作定界符无需转义 ?php $x preg_match(#/[AZ]#D, $m); // 来自 ereg(/[AZ], $m) // 模式含 / 和 #改用 !并转义 ! 与 / ?php $x preg_match(!##[A\!]//!D, $m); // 来自 ereg(##[A!]//, $m) // 三个定界符全部出现时选择出现次数最少的 / 并做转义 ?php $x preg_match(/##[A!!]\/\//D, $m); // 来自 ereg(##[A!!]//, $m)可以看到无论模式内容如何刁钻同时包含/、#、!规则都能选出代价最小的定界符方案保证转换后的模式仍然合法可运行。安全机制三重守卫确保转换正确ereg_to_preg并非无脑的字符串替换源码中内置了三重守卫只有全部通过才会执行改写守卫一必须是全局函数调用规则通过 FunctionsAnalyzer::isGlobalFunctionCall 判断目标T_STRING是否确实是对全局命名空间函数的调用。以下情况都会被跳过与 测试用例 一一对应?php $x Foo::split([A-Z], $m); // 静态方法调用不转换 ?php $x $foo-split([A-Z], $m); // 实例方法调用不转换 ?php $x Foo\split([A-Z], $m); // 命名空间函数调用不转换这一守卫正是文档 Warning 中 Risky if theeregfunction is overridden 的源码级体现如果项目用命名空间导入或自定义了同名函数规则不会误伤它们。守卫二第一个参数必须是完整字符串字面量规则只处理第一个参数为单个字符串字面量的调用源码中 检查下一个有意义 token 是否为,或)。遇到拼接等复杂表达式时会直接跳过?php $x ereg([A-Z].foo, $m); // 字符串拼接无法安全转换跳过守卫三转换后的 PCRE 必须通过实际校验在改写 token 之前规则会调用 checkPreg 方法 通过项目自带的 Preg 类 对生成的模式执行一次真实的preg_match试运行如果模式非法例如ereg(^*broken, $m)这种在 PCRE 下无法编译的模式规则会跳过该调用而不是生成一个运行时才会报错的坏代码。规则的执行优先级与生效规则集与其他规则的协作顺序从 getPriority 方法 的注释可以看到该规则声明了Must run after NoUselessConcatOperatorFixer优先级为0。也就是说在修复流水线中no_useless_concat_operator会先于ereg_to_preg运行——这保证了字符串拼接类表达式在进入本规则时已经尽可能被规整为单一字面量扩大可转换范围。所属规则集规则文档列出了两条包含该规则的 Risky 规则集PhpCsFixer:risky在源码 src/RuleSet/Sets/PhpCsFixerRiskySet.php 中该规则集通过Symfony:risky间接引入ereg_to_preg其getRules()首行即包含Symfony:risky true对应文档 doc/ruleSets/PhpCsFixerRisky.rstSymfony:risky在源码 src/RuleSet/Sets/SymfonyRiskySet.php 中直接声明ereg_to_preg true对应文档 doc/ruleSets/SymfonyRisky.rst。因此在.php-cs-fixer.dist.php配置中使用Symfony:risky true或PhpCsFixer:risky true即可自动启用这条规则也可以按需单独启用?php // .php-cs-fixer.dist.php return (new PhpCsFixer\Config()) -setRules([ Symfony:risky true, // 集合方式随 Symfony 风格 Risky 集启用 // 或者单独启用 ereg_to_preg true, ]) -setFinder(PhpCsFixer\Finder::create()-in(__DIR__));使用建议与注意事项启用前先排查同名函数由于规则是 Risky 的建议先在项目中全局搜索function ereg、function split等自定义定义以及use function ereg;之类的导入语句确认不存在覆盖后才放心启用。前述FunctionsAnalyzer守卫能拦截大部分非全局调用场景但全局命名空间内的同名函数覆盖仍需人工确认。配合修复命令使用可通过php-cs-fixer fix path/to/code --rulesereg_to_preg单独针对该规则运行或--dry-run --diff先预览将要产生的改动再落地。语义对齐已被测试锁定D修饰符、i修饰符、定界符选择、二进制字符串前缀保留等行为全部被 EregToPregFixerTest 的测试用例锁定文档明确指出该测试类定义了官方支持的行为且每个测试用例都是向后兼容承诺的一部分升级 PHP-CS-Fixer 时行为稳定性有保障。小结ereg_to_preg是一条小而精的迁移型 Risky 规则它把 6 个已被 PHP 移除的 POSIX 正则函数机械地映射为 3 个等价的 PCRE 函数并通过D修饰符对齐$语义、通过最小转义定界符策略保证模式合法性、通过三重守卫全局函数判定、字面量参数判定、PCRE 实际校验把误转换风险降到最低。对于仍在维护的历史代码库在确认无同名函数覆盖的前提下通过Symfony:risky或PhpCsFixer:risky规则集启用它是向现代 PHP 迁移低成本且高收益的一步。赞分享开发工具代码质量静态分析Lint格式化【免费下载链接】PHP-CS-FixerA tool to automatically fix PHP Coding Standards issues项目地址https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer点击查看免费下载相关推荐PHP-CS-Fixer 规则集 PHP70MigrationPHP 7.0 兼容性规则与废弃迁移指南PHP CS Fixer 规则集 PHP70Migration PHP 7.0 兼容性规则与废弃迁移指南 PHP70Migration 是 PHP CS开发工具代码质量静态分析Lint格式化PHP-CS-Fixer 规则集详解从弃用的 PER-CS1.0 迁移到 PER-CS1x0PHP CS Fixer 规则集详解从弃用的 PER CS1.0 迁移到 PER CS1x0 导读 本文以 PHP CS Fixer 官方规则集文档 do开发工具代码质量静态分析Lint格式化Feather框架革命性同步Rust Web框架告别async/await的复杂性Feather框架革命性同步Rust Web框架告别async/await的复杂性 Feather框架是一个革命性的同步Rust Web框架它通过创新的同开发工具代码质量静态分析Lint格式化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

10个免费资源网站推荐:设计素材、PPT模板、PDF工具与学习平台

10个免费资源网站推荐:设计素材、PPT模板、PDF工具与学习平台

1. 为什么我花了三个月才敢推荐这10个网站做资源搜集这件事,我踩过的坑比大多数人想象的多得多。早些年我习惯用搜索引擎直接找资料,结果要么是点进去发现要注册充值,要么是下载下来一堆捆绑软件,最离谱的一次是找一个PDF模板&…

2026/9/24 8:42:02 阅读更多 →
SolidWorks圆柱凸轮建模与Motion仿真避坑指南

SolidWorks圆柱凸轮建模与Motion仿真避坑指南

1. 项目概述:为什么圆柱凸轮不是“画个圆柱再切一刀”就完事了?SolidWorks里建模一个圆柱凸轮机构,表面看就是拉伸个圆柱体、再用扫描或放样切出凸轮廓线——但凡真动手做过运动仿真的人,三分钟内就会被Motion模块报错弹窗反复教育…

2026/9/24 8:42:19 阅读更多 →
如何从零筛选靠谱的小程序开发公司?避坑指南与评估框架

如何从零筛选靠谱的小程序开发公司?避坑指南与评估框架

目录先说结论:能直接照抄的“十大榜单”在网上并不存在,或者说,任何一份直接列出“十大靠谱小程序开发公司”的榜单,你都要打个问号。原因很简单——小程序开发这个行业高度定制化,同一个项目在不同公司手里&#xff0…

2026/9/24 9:20:54 阅读更多 →

最新新闻

Claude Code 配置 settings.json:接入 TaoToken 统一 Key 与模型权限免校验

Claude Code 配置 settings.json:接入 TaoToken 统一 Key 与模型权限免校验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:18:44 阅读更多 →
5 分钟上手 renderdoc-mcp:让 AI 帮你分析 GPU 抓帧

5 分钟上手 renderdoc-mcp:让 AI 帮你分析 GPU 抓帧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:18:44 阅读更多 →
代码高亮库prettify实战指南:三件套用法、动态渲染与避坑排查

代码高亮库prettify实战指南:三件套用法、动态渲染与避坑排查

简介:网页中展示源代码时常因缺乏语法高亮而难以阅读,针对这一需求,Prettify代码高亮资源包提供了一套基于CSS与JavaScript的完整方案,面向初中级前端开发者、技术博主及文档编写者。压缩包共含三个文件,以一个CSS样式…

2026/9/25 13:18:44 阅读更多 →
Gemini 2.5 Flash Lite 轻量化智能应用实战:TaoToken 统一 Key 接入与 config.toml 配置骨架

Gemini 2.5 Flash Lite 轻量化智能应用实战:TaoToken 统一 Key 接入与 config.toml 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:18:44 阅读更多 →
可白嫖源码---课程设计----毕业设计-- 房屋租赁管理系统project95339(案件分析)

可白嫖源码---课程设计----毕业设计-- 房屋租赁管理系统project95339(案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 摘 要 传…

2026/9/25 13:18:44 阅读更多 →
CTF 内核利用中的 KASLR:原理、QEMU 开关实战与绕过思路(ctf-wiki 内核防护篇)

CTF 内核利用中的 KASLR:原理、QEMU 开关实战与绕过思路(ctf-wiki 内核防护篇)

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 导读 KASLR(Kernel Address Space Layout Randomization,内核地址空间布局随机化&a…

2026/9/25 13:17:43 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →