You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.4.7至7.4.8中mb_ereg_search_regs带b选项行为异常问题

关于PHP mb_ereg_search_regs在7.4.8+版本中匹配失败的问题分析

测试代码

$sTestString = "BEGIN:VEVENT";
$sPattern = '^(BEGIN|END)\:(.+)$';
$sRegex_opt = 'mib';
mb_ereg_search_init( $sTestString );
print_r(mb_ereg_search_regs( $sPattern, $sRegex_opt ));

不同版本执行结果

  • PHP 7.4.7 执行结果:
Array
(
    [0] => BEGIN:VEVENT
    [1] => BEGIN
    [2] => VEVENT
)
  • PHP 7.4.8 及以上版本执行结果:返回空数组

问题关联与原因分析

该行为变化确实和你提到的mbstring代码提交直接相关,这个提交修复了mb_ereg系列函数中b选项的处理逻辑:

  • 在此之前的版本(如7.4.7)中,b选项实际上被忽略,没有生效,所以m(多行模式)下^和$正常匹配行首和行尾,你的模式能正确匹配单行字符串。
  • 修复后,b选项开始正确生效,它的作用是强制匹配操作基于字节边界,且要求整个匹配范围是完整的字符串字节序列。此时m(多行模式)和b选项的逻辑产生冲突:m模式让^/$匹配行首/行尾,而b选项要求^/$匹配整个字符串的开头/结尾,两者叠加后,你的模式无法满足同时匹配行锚点和完整字符串边界的要求,因此返回空结果。

移除b选项后,m模式的行锚点逻辑正常工作,所有版本的匹配结果就一致了。

内容的提问来源于stack exchange,提问作者asgaroth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:40:24