首页/开发/正则与编码速查/PHP 全局匹配的排序标志

PHP 全局匹配的排序标志

PHP 全局匹配用标志决定结果形状:默认按组聚合(先按组号再按匹配序号),另一标志按匹配聚合(每次匹配的字段打包在一起),还可附加偏移信息与空值区分标志。偏移按字节计,多字节文本下与字符索引不同,选错聚合标志不会报错但取值全错。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌​​​​‌‌‌​​​​​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​‌‌​​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

PHP 全局匹配的结果组织方式

全局匹配函数用标志决定返回结果的形状:默认按组聚合,即先给整体匹配的全部取值,再给第一组的全部取值依次排列;另一种标志改为按匹配聚合,把每一次匹配的所有字段打包在一起。选错标志不会报错,只会让取值代码拿到另一个维度的数据,这是使用这些函数时最典型的错误。

基本信息

默认标志按组聚合:下标 0 是全部整体匹配,下标 1 是第一组的全部取值,依此类推
按匹配聚合把每次匹配的字段打包,下标 0 是第一次匹配的完整信息
偏移信息附带偏移标志后,每个值变成内容与字节偏移两项
空值区分未参与匹配的组默认是空字符串,可用专门标志改为空值以便区分

典型使用场景

  • 统计字段分布:按组聚合时可以直接对某一列做计数与聚合
  • 逐条记录处理:按匹配聚合便于把每次匹配当作一条记录写入数据库
  • 高亮与替换:需要位置信息时附带偏移标志,取出内容与字节位置
  • 区分缺失与空值:需要明确某个可选字段是否出现时使用空值标志
  • 批量校验:一次匹配全部结果,减少重复调用带来的开销

两种组织方式实测

两种组织方式实测
$s = 'a-1 b-2';
$n = preg_match_all('/(\w+)-(\d+)/', $s, $m);        // 默认按组聚合,返回 2
$m[0];     // ['a-1', 'b-2']:全部整体匹配
$m[1];     // ['a', 'b']:第一组的全部取值
preg_match_all('/(\w+)-(\d+)/', $s, $s2, PREG_SET_ORDER);   // 按匹配聚合
$s2[0];    // ['a-1', 'a', '1']:第一次匹配的完整字段
preg_match_all('/(a)?(b)/', 'b', $m3, PREG_UNMATCHED_AS_NULL); // 未参与组为 null
preg_match_all('/\w/', $s, $m4, PREG_OFFSET_CAPTURE);          // 附带字节偏移
$m4[0][0];  // ['a', 0]:内容与起始字节位置

结果结构对照

标志结构形态取值方式
按组聚合(默认)第一维是组号,第二维是匹配序号先选字段再遍历匹配
按匹配聚合第一维是匹配序号,第二维是组号先取一次匹配再取字段
附带偏移每个值为内容与偏移两项需要同时读内容和位置
空值标志未参与组为 null区分缺失与匹配到空内容
偏移量的单位是字节而不是字符:处理多字节文本时用字符索引函数会错位,需要截取上下文时要么按字节处理,要么重新计算字符位置。
两个排序标志不应同时指定,混用时结果结构不可预期;确定取值代码的写法后,把所用标志写进函数调用的注释里,能显著减少后续维护中的误改。

易错点

  • 用默认标志却按逐条记录的方式取值:拿到的是某一组的完整列表,字段全错但程序不报错
  • 把偏移当字符位置使用:多字节文本下截取位置错位,得到乱码或错位内容
  • 无法区分缺失与空值:可选字段未参与时得到空字符串,与匹配到空内容混淆
  • 输出参数传值不当:结果变量必须按引用接收,写成表达式或临时值会拿不到数据
  • 忽略返回值为零时仍会填充空数组:遍历结果时未判断计数,对空数据做了多余处理

数据来源与参考

  • PHP 手册:preg_match_all 的 flags 参数与预定义常量
  • PHP 手册:PREG_SET_ORDER、PREG_PATTERN_ORDER 与 PREG_OFFSET_CAPTURE
  • PHP 手册:PREG_UNMATCHED_AS_NULL 说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/php-preg-match-all-flags.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌​​​​‌‌‌​​​​​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​‌‌​​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​