腾讯云 COS WordPress 插件 PHP 7.3+ / PCRE2 兼容性修复说明

路 南 发布于 1 天前 18 次阅读



快速下载链接:https://yunpan.lunan.cloud/s/6VoI1

插件目录 1778938958-tencent-cloud-cos(路南 COS PHP8 专版 v1.0.10)
修复文件 class-tencent-cloud-cos.php
影响功能 文章内容处理中的「文档预览」正则匹配 tcwpcosImageProcessing


问题现象

PHP 7.3 及以上(含 PHP 8.0 / 8.1 / 8.2)的 WordPress 站点上,使用旧版腾讯云 COS 插件时可能出现:

  • 媒体库上传失败或行为异常
  • 后台/前台出现 preg_match_all / preg_replace 相关警告或致命错误
  • 典型报错:preg_match_all(): Compilation failed: PCRE2 does not support \F, \L, \l, \N{name}, \U, or \u at offset ...

开启「文档预览」后,访问含中文路径附件链接的文章时更容易触发。

问题定位:插件与高版本 PHP 的兼容性 Bug

根因不在 COS 密钥或桶配置,而是 正则引擎从 PCRE 升级到 PCRE2 后的语法不兼容。

项目 说明
触发版本 PHP 7.3+ 默认使用 PCRE2
问题代码位置 class-tencent-cloud-cos.phptcwpcosImageProcessing() 文档预览逻辑(约第 512–538 行)
旧写法 正则字符类中使用 \u4e00-\u9fa5 等 PCRE1 旧 Unicode 语法
后果 正则编译失败 → preg_match_all() 报错 → 钩子执行中断 → 影响站点稳定性

该函数通过 the_content 过滤器挂载,文章渲染时执行;若错误被提升为异常,可能导致整站/后台异常,易被误认为上传故障。

已实施的修复(本专版)

路南 COS PHP8 专版 中,已将两处文档预览正则 $pattern 改为 PCRE2 兼容写法

修复前(PCRE1 旧语法,PHP 7.3+ 编译失败):

// 示意:字符类内使用 \uXXXX
$pattern = '/...([\/]?[\u4e00-\u9fa5]+)(.*)\">/';
preg_match_all($pattern, $content, $matches);

修复后(PCRE2 + UTF-8 模式):

$pattern = '//u';
preg_match_all($pattern, $content, $matches);

经典编辑器分支已同步修复:

$pattern = '/

/u'; preg_match_all($pattern, $content, $matches);

修复要点:

  1. \u4e00-\u9fa5\x{4e00}-\x{9fa5}(Unicode 码点标准写法)
  2. 正则末尾增加 /u 修饰符(UTF-8 字符串模式)
  3. 功能保持不变:仍用于匹配 URL 路径中的中文片段

未修复旧包处理方案(按优先级)

方案 1:直接修改插件代码(最快)

  1. 通过 FTP/面板打开:wp-content/plugins/1778938958-tencent-cloud-cos/class-tencent-cloud-cos.php
  2. 搜索文档预览相关 $pattern(约 517、537 行附近)
  3. [\u4e00-\u9fa5] 改为 [\x{4e00}-\x{9fa5}],并确保正则以 /u 结尾
  4. 保存后刷新后台,测试上传与中文文件名附件预览

方案 2:更换兼容版本(推荐长期)

  • 使用已修复 PCRE2 的专版(如本次 路南 COS PHP8 专版
  • 或使用 WordPress 官方仓库持续维护的版本
  • 避免使用多年未更新的旧包

方案 3:临时降级 PHP(仅应急)

  • 降级到 PHP 7.2 及以下可临时避开 PCRE2,但存在安全风险,不建议长期使用

验证修复是否生效

  1. PHP 版本:≥ 7.3(建议 8.0+)
  2. 上传测试:媒体库上传无 preg_* 报错
  3. 文档预览:docx/pdf 等附件预览正常插入 iframe
  4. 错误日志:插件日志目录无正则编译错误

说明:若出现 403 Forbidden / Signature invalid,属于 COS 密钥/桶配置问题,与本次 PCRE2 修复无关。

小结

状态 内容
问题类型 PHP 7.3+ / PCRE2 不兼容旧正则 \u 语法
修复方式 \x{4e00}-\x{9fa5} + /u 修饰符
本专版状态 已合入修复,PHP 8 环境可正常使用文档预览

 

此作者没有提供个人介绍。
最后更新于 2026-05-17