preg_match_all的两种用法
作者:admin 日期:2015-09-18
preg_match_all的作用是把一个字符串中所有与正则表达式匹配的文本提取出来。一般人只知道它的一种用法,其实它还有另外一种用法。首先看它的原型。
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
pattern是正则,subject是待匹配的字符串,matches是匹配的结果。最后一个flag是一个标记。
第一种用法。
<?php $html = "http://www.zeroplace.cn/default.asp?cateID=28\nhttp://www.zeroplace.cn/default.asp?cateID=27"; $pattern = "/http:\/\/www\.zeroplace\.cn\/default\.asp\?cateID=(\d+)/"; preg_match_all($pattern, $html, $matches); print_r($matches);
它的输出是:
Array ( [0] => Array ( [0] => http://www.zeroplace.cn/default.asp?cateID=28 [1] => http://www.zeroplace.cn/default.asp?cateID=27 ) [1] => Array ( [0] => 28 [1] => 27 ) )
也就是返回的结果是一个数组,它的长度是你的模式数+1,大致可以理解为正则中的括号数((?:xx)除外)。第0个元素是所有的全模式匹配结果,第1个是所有的第一个模式的匹配,依次类推。这是常见的一种用法。
有没有觉得这个结果有点怪呢,如果我的模式之间存在某种关系,写循环的时候还要根据$index去其它的数组里面去提取值。比如:
foreach ($matches[1] as $index => $cateID) { printf("%s, %s\n", $cateID, $matches[0][$index]); }
有强迫症的同学可能就会觉得这样的代码不舒服了。因为它要求$matches[0]与$matches[1]中的元素一一对应。
这种情况下,flag就发挥作用了。它可以改变返回的结构,使它成为一种更加合理的结构。
preg_match_all($pattern, $html, $matches, PREG_SET_ORDER); print_r($matches); foreach ($matches as list($url, $cateID)) { printf("%s, %s\n", $cateID, $url); }
这样看起来就非常舒服了。
评论: 0 | 查看次数: 25791