今天在写通用采集类的时候,需要用到正则处理一些匹配,比较常用的当然就是preg_match_all了,以前也经常使用它来进行正则的匹配。刚在查看preg_match_all的手册的时候,注意到原来preg_match_all有一个PREG_SET_ORDER的参数,是用于设置匹配后返回的数组的顺序。
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
参数flags为以下3个:PREG_PATTERN_ORDER PREG_SET_ORDER PREG_OFFSET_CAPTURE 其中PREG_PATTERN_ORDER为默认参数。
我们用例子来看看PREG_PATTERN_ORDER和PREG_SET_ORDER的区别。
<?php $str = '<a href="http://www.baidu.com/">百度</a><a href="http://www.google.com/">谷歌</a><a href="http://www.caiguai.net/">怪手论坛</a>'; preg_match_all('|<a href="(.*?)">(.*?)</a>|', $str, $matches_pattern, PREG_PATTERN_ORDER); preg_match_all('|<a href="(.*?)">(.*?)</a>|', $str, $matches_set, PREG_SET_ORDER); print_r($matches_pattern); print_r($matches_set);
$matches_pattern 返回的数据为:
Array ( [0] => Array ( [0] => <a href="http://www.baidu.com/">百度</a> [1] => <a href="http://www.google.com/">谷歌</a> [2] => <a href="http://www.caiguai.net/">怪手论坛</a> ) [1] => Array ( [0] => http://www.baidu.com/ [1] => http://www.google.com/ [2] => http://www.caiguai.net/ ) [2] => Array ( [0] => 百度 [1] => 谷歌 [2] => 怪手论坛 ) )
Array ( [0] => Array ( [0] => <a href="http://www.baidu.com/">百度</a> [1] => http://www.baidu.com/ [2] => 百度 ) [1] => Array ( [0] => <a href="http://www.google.com/">谷歌</a> [1] => http://www.google.com/ [2] => 谷歌 ) [2] => Array ( [0] => <a href="http://www.caiguai.net/">怪手论坛</a> [1] => http://www.caiguai.net/ [2] => 怪手论坛 ) )
foreach ($matches_pattern[0] as $tid=>$val) { echo '链接:'.$matches_pattern[1][$tid]; echo '网址:'.$matches_pattern[2][$tid]; echo "\r\n"; } /** * 返回结果为: * 链接:http://www.baidu.com/网址:百度 链接:http://www.google.com/网址:谷歌 链接:http://www.caiguai.net/网址:怪手论坛 */
foreach ($matches_set as $v) { echo '链接:'.$v[1]; echo '网址:'.$v[2]; echo "\r\n"; } /** * 返回结果为: * 链接:http://www.baidu.com/网址:百度 链接:http://www.google.com/网址:谷歌 链接:http://www.caiguai.net/网址:怪手论坛 */
首发于:http://www.caiguai.net/thread-21-1-1.html