PHP preg_match_all() 函数和 preg_match() 函数相似,主要有两点不同:
第一个不同是后者在第一次匹配成功后将会停止搜索,而前者则会一直搜索匹配到目标字符串的结尾处;
另一个不同是 preg_match_all() 的 flags 参数可设置为 PREG_PATTERN_ORDER、PREG_SET_ORDER 或 PREG_OFFSET_CAPTURE。
若 flags 设置为 PREG_PATTERN_ORDER(这也是默认值),则结果排序为 $matches[0] 保存完整模式的所有匹配,$matches[1] 保存第一个子组的所有匹配,以此类推。
若 flags 设置为 PREG_SET_ORDER,则结果排序为 $matches[0] 包含第一次匹配得到的所有匹配(包含子组),$matches[1] 是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。
当 flags 的值被设置为 PREG_OFFSET_CAPTURE 时,每个发现的匹配返回时会增加它相对目标字符串的偏移量。
注意,这会改变 matches 中的每一个匹配结果字符串元素,使其成为一个第 0 个元素为匹配结果字符串、第 1 个元素为匹配结果字符串在 subject 中的偏移量。
preg_match_all() 函数的使用示例如下:
<?php echo "
"; $subject = "abcdefghijkdefabcedfdefxyzdef"; $pattern_1 = '/(def)(abc)/'; $num_1 = preg_match_all($pattern_1, $subject, $matches_1,PREG_PATTERN_ORDER); var_dump($matches_1); var_dump($num_1); $pattern_2 = '/(def)(abc)/'; $num_2 = preg_match_all($pattern_2, $subject, $matches_2,PREG_OFFSET_CAPTURE, 3); var_dump($matches_2); var_dump($num_2); ?>
执行以上程序的结果如下:
array(3) {
[0]=>array(1)
{
[0]=>string(6) "defabc"
}
[1]=>array(1)
{
[0]=>string(3) "def"
}
[2]=>array(1)
{
[0]=>string(3) "abc"
}
}
int(1)
array(3) {
[0]=>array(1)
{
[0]=>array(2)
{
[0]=>string(6) "defabc"
[1]=>int(11)
}
}
[1]=>array(1)
{
[0]=>array(2)
{
[0]=>string(3) "def"
[1]=>int(11)
}
}
[2]=>array(1)
{
[0]=>array(2)
{
[0]=>string(3) "abc"
[1]=>int(14)
}
}
}
int(1)