preg_match_all() 函数和pre_match() 函数功能类似,不同的是 preg_match() 在第一次匹配后就会停止搜索,而 preg_match_all() 会一直搜索到指定的字符串末尾,因此可以获取到所有匹配的结果。函数语法格式如下:
[Plain Text] 纯文本查看 复制代码 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
函数把所有可能的匹配结果都放在第 3 个数组参数中,并返回整个模式匹配的次数,如果出错,则返回 False 。
第 4 个参数会根据它指定的顺序将每次出现的匹配结果保存到第 3 个参数的数组中,它有 2 个预定义值。
PREG_PATTERN_ORDER
它是 preg_match_all() 的默认值,对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
PREG_SET_ORDER
对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第 2 组匹配项的数组,以此类推。
测试代码:
[PHP] 纯文本查看 复制代码 <?php
$pattern = '/(https?|ftps?):\/\/(\w+)\.([^\.\/]+)\.(com|net|org|cn)(\/[\w-\.\/\?\%\&\=]*)?/i';
$subject = "欢迎阅读 http://www.groad.net/bbs/read.php?tid-7070.html 此篇帖子,
欢迎使用谷歌搜索引擎: http://www.google.com/search.php, 大家来下载 ftp://ftp.baidu.com/god.tar.gz";
$i = 1;
if (preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) {
foreach($matches as $urls) {
echo "第".$i."个 URL 为: ".$urls[0]."<br>";
echo "第".$i."个 URL 中的协议为: ".$urls[1]."<br>";
echo "第".$i."个 URL 中的主机为: ".$urls[2]."<br>";
echo "第".$i."个 URL 中的域名为: ".$urls[3]."<br>";
echo "第".$i."个 URL 中的顶域为: ".$urls[4]."<br>";
echo "第".$i."个 URL 中的文件为: ".$urls[5]."<br>";
echo "======================<br>";
$i++;
}
}
?>
运行输出:第1个 URL 为: http://www.groad.net/bbs/read.php?tid-7070.html
第1个 URL 中的协议为: http
第1个 URL 中的主机为: www
第1个 URL 中的域名为: groad
第1个 URL 中的顶域为: net
第1个 URL 中的文件为: /bbs/read.php?tid-7070.html
======================
第2个 URL 为: http://www.google.com/search.php
第2个 URL 中的协议为: http
第2个 URL 中的主机为: www
第2个 URL 中的域名为: google
第2个 URL 中的顶域为: com
第2个 URL 中的文件为: /search.php
======================
第3个 URL 为: ftp://ftp.baidu.com/god.tar.gz
第3个 URL 中的协议为: ftp
第3个 URL 中的主机为: ftp
第3个 URL 中的域名为: baidu
第3个 URL 中的顶域为: com
第3个 URL 中的文件为: /god.tar.gz
====================== 上面将第 4 个参数指定为 PREG_SET_ORDER,因此最后生成的数组是个二维数组,其中第一维是整个正则表达式的匹配,第二维中的每个元素是该正则匹配中的子单元匹配。 |