全局 RegExp 匹配

一个全局性的 RegExp 匹配可以用 preg_match_all 进行。preg_match_all 返回主题字符串中的所有匹配结果(与 preg_match 相反,preg_match 仅返回第一个)。

preg_match_all 函数返回匹配数。第三个参数 $matches 将包含由可在第四个参数中给出的标志控制的格式的匹配。

如果给定一个数组,$matches 将包含与 preg_match 相似的格式的数组,除了 preg_match 在第一次匹配时停止,其中 preg_match_all 遍历字符串直到字符串被完全消耗并返回多维数组中每次迭代的结果,哪种格式可以由第四个参数中的标志控制。

第四个参数 $flags 控制 $matches 数组的结构。默认模式是 PREG_PATTERN_ORDER,可能的标志是 PREG_SET_ORDERPREG_PATTERN_ORDER

以下代码演示了 preg_match_all 的用法:

$subject = "a1b c2d3e f4g";
$pattern = '/[a-z]([0-9])[a-z]/';

var_dump(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)); // int(3)
var_dump($matches);
preg_match_all($pattern, $subject, $matches); // the flag is PREG_PATTERN_ORDER by default
var_dump($matches);
// And for reference, same regexp run through preg_match()
preg_match($pattern, $subject, $matches);
var_dump($matches);

PREG_SET_ORDER 的第一个 var_dump 给出了这个输出:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(3) "a1b"
    [1]=>
    string(1) "1"
  }
  [1]=>
  array(2) {
    [0]=>
    string(3) "c2d"
    [1]=>
    string(1) "2"
  }
  [2]=>
  array(2) {
    [0]=>
    string(3) "f4g"
    [1]=>
    string(1) "4"
  }
}

$matches 有三个嵌套数组。每个数组代表一个匹配,其格式与 preg_match 的返回结果相同。

第二个 var_dump(PREG_PATTERN_ORDER)给出了这个输出:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(3) "a1b"
    [1]=>
    string(3) "c2d"
    [2]=>
    string(3) "f4g"
  }
  [1]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
    [2]=>
    string(1) "4"
  }
}

当通过 preg_match 运行相同的正则表达式时,将返回以下数组:

array(2) {
  [0] =>
  string(3) "a1b"
  [1] =>
  string(1) "1"
}