例子:
$str="/post/<action:\w+>/<key:\d+>/";
//NULL
preg_match_all("/<(\w+):?([^>]+)?>/",$str,$matches);
echo "NULL";
var_dump($matches);
//PREG_PATTERN_ORDER
preg_match_all("/<(\w+):?([^>]+)?>/",$str,$matches,PREG_PATTERN_ORDER);
echo "PREG_PATTERN_ORDER";
var_dump($matches);
//PREG_SET_ORDER
preg_match_all("/<(\w+):?([^>]+)?>/",$str,$matches,PREG_SET_ORDER);
echo "PREG_SET_ORDER";
var_dump($matches);
//PREG_OFFSET_CAPTURE | PREG_SET_ORDER
preg_match_all("/<(\w+):?([^>]+)?>/",$str,$matches,PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
echo "PREG_OFFSET_CAPTURE | PREG_SET_ORDER";
var_dump($matches);
输出结果:
NULL
array (size=3) 0 => array (size=2) 0 => string '<action:\w+>' (length=12) 1 => string '<key:\d+>' (length=9) 1 => array (size=2) 0 => string 'action' (length=6) 1 => string 'key' (length=3) 2 => array (size=2) 0 => string '\w+' (length=3) 1 => string '\d+' (length=3)
PREG_PATTERN_ORDER
array (size=3) 0 => array (size=2) 0 => string '<action:\w+>' (length=12) 1 => string '<key:\d+>' (length=9) 1 => array (size=2) 0 => string 'action' (length=6) 1 => string 'key' (length=3) 2 => array (size=2) 0 => string '\w+' (length=3) 1 => string '\d+' (length=3)
PREG_SET_ORDER
array (size=2) 0 => array (size=3) 0 => string '<action:\w+>' (length=12) 1 => string 'action' (length=6) 2 => string '\w+' (length=3) 1 => array (size=3) 0 => string '<key:\d+>' (length=9) 1 => string 'key' (length=3) 2 => string '\d+' (length=3)
PREG_OFFSET_CAPTURE | PREG_SET_ORDER
array (size=2) 0 => array (size=3) 0 => array (size=2) 0 => string '<action:\w+>' (length=12) 1 => int 6 1 => array (size=2) 0 => string 'action' (length=6) 1 => int 7 2 => array (size=2) 0 => string '\w+' (length=3) 1 => int 14 1 => array (size=3) 0 => array (size=2) 0 => string '<key:\d+>' (length=9) 1 => int 19 1 => array (size=2) 0 => string 'key' (length=3) 1 => int 20 2 => array (size=2) 0 => string '\d+' (length=3) 1 => int 24
总结:
1. 不加标志和使用PREG_PATTERN_ORDER标志是等效的
2. 对于PREG_PATTERN_ORDER标志
a. 生成的结果为二维数组
b. array[0] 为所有匹配的完整字符串
c. array[1] 为匹配模式串中第一个小括号匹配到的所有字符串,例如例子中的匹配模式串为"/<(\w+):?([^>]+)?>/”,
包含两个小括号,第一个为(\w+),第二个为([^>]+),因此array[1]保存的是(\w+)匹配到的所有字符串
d: array[2]同理,保存的是第二个小括号匹配到的所有字符串,如果还有更多的小括号,依次类推。
3. 对于PREG_SET_ORDER标志
a. 生成的结果为二维数组
b. array[0] 为第一个匹配到的字符串及其相关的子字符串,从输出结果可以看出,array[0][0]为第一个匹配到的完整
的字符串,然后array[0]内后续的元素分别对应第一个小括号匹配的字符串,第二个小括号匹配的字符串,依次类推。
c. array[1]同上,为第二个匹配到的字符串及其相关的子字符串。以此类推。
4. 对于PREG_PATTERN_ORDER和PREG_SET_ORDER标志
a. 生成的结果为三维数组
b. 从输出结果可以看出,这种混合标志类型是在PREG_SET_ORDER标志基础之上,对其每个元素绑定了一个偏移量
需要注意的是,这里偏移量的计数是从0开始计数的。
从输出结果可以看出PREG_PATTERN_ORDER每一个数组包含的都是匹配到所有字符串,而PREG_SET_ORDER则
是一个一个地处理匹配到的字符串。
初学php,以上存在理解错误之处,希望能给予指正,相互学习,共同进步。