曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3392|回复: 0
打印 上一主题 下一主题

preg_match_all() -- 全局正则搜索匹配

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-5-22 00:49:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,因此最后生成的数组是个二维数组,其中第一维是整个正则表达式的匹配,第二维中的每个元素是该正则匹配中的子单元匹配。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 05:11 , Processed in 0.079100 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表