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 | 查看次数: 26113
订阅
yii2 去掉 index.php
VS2013 密钥 – 所有版本

文章来自:
Tags: