php手册中是这样解释的
matches
如果提供了参数matches
,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推
到底是什么意思呢?
$matchs[0]很好理解,就是整个$pattern 匹配的文本,
$matchs[1]包含第一个捕获子组匹配到的文本,
列子:
$pattern = '/^(http:\/\/)?([^\/]+)/i';
$subject = 'http://www.php.net/index.html';
preg_match_all($pattern,$subject,$match); var_dump($match);
输出
array (size=3)
0 =>
array (size=1)
0 => string 'http://www.php.net' (length=18) 1 => array (size=1) 0 => string 'http://' (length=7) 2 => array (size=1) 0 => string 'www.php.net' (length=11)
数组中第一个$matchs[0]就是整个$pattern匹配到的文本元素
$pattern = '/^(http:\/\/)?([^\/]+)/i'; 这是正则表达式
$matchs[0] 就是整个正则匹配到的文本
$matchs[1] 匹配到的是子组 (http:\/\/) 匹配到的文本 所谓的子组 其是就是增则表达式里的一对对()。(http:\/\/) 是第一对
$matchs[2] 匹配到的是子组(^\/+) 匹配到的文本 (^\/+)是第二对
理解了么?
我是理解了
$matches[1] 将包含第一个捕获子组匹配到的文本。
就真的是第一个子组 也就是()中pattern匹配到的文本啊。
以上 原文地址:http://www.cnblogs.com/tumio/p/5390268.html
自己遇到的一个例子 比如:
$key='ad1_image_url'; $value='data/files/mall/template/2016081708483821016.jpg' $ads=array();
if(preg_match("/^ad(\d+)_image_url$/",$key,$matches)){
$ads[$matches[1]]['ad_image_url'] = $value;
}
这个时候打印$ads 结果如下:
很明显是个数组,里面有一个键值对
在打印 $ads[$matches[1]] 结果如下:
通过对比 就可以看出来 正则表达式中 第一对() 是匹配的数字,也就是上面$key中的1, 然后我把它当数组的键,用于存储$value,也就是说 $matches[1] 的值就是正则表达式里第一个 ()所匹配的内容。
补充; preg_match() 和preg_match_all() 有区别,前者是匹配到一个就停止,后面的不再进行匹配,后者是从all上也可以看出来,是匹配到字符串结尾。
综上所述,懂了 (→_→)