preg_match_all的两种用法

 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);
}

 这样看起来就非常舒服了。



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 25075