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
相关产品推荐
相关产品推荐

