preg_match_all使用心得分享


Posted in PHP onJanuary 31, 2014

preg_match_all — 进行全局正则表达式匹配

说明

int preg_match_all ( string pattern, string subject, array matches [, int flags] )

在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。
搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。

特别注意PREG_PATTERN_ORDER 和PREG_SET_ORDER

flags 可以是下列标记的组合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起来用没有意义):

如果使用PREG_PATTERN_ORDER

对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。(即$matches[0] [0]为全部模式匹配中的每一项,$matches[0] [1]为全部模式匹配中的第二项,$matches[1] [0]为匹配每一个括号中的第一项,$matches[1] [0]为匹配每一个括号中的第二项)

<?php 
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U","<b>example: </b><div align=left>this is a test</div>",$out, PREG_PATTERN_ORDER);print $out[0][0].", ".$out[0][1]."\n"; 
print $out[1][0].", ".$out[1][1]."\n"; 
?> 

本例将输出:

<b>example: </b>, <div align=left>this is a test</div> 
example: , this is a test

因此,$out[0] 包含匹配整个模式的字符串,$out[1] 包含一对 HTML 标记之间的字符串。
如果使用PREG_SET_ORDER

对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。(即$matches[0] [0]为第一组匹配项中完整匹配的字符串,$matches[0] [1]为第一组匹配中完整匹配第一个括号中的字符串)

<?php 
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U","<b>example: </b><div align=left>this is a test</div>",$out, PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."\n"; 
print $out[1][0].", ".$out[1][1]."\n"; 
?>

本例将输出:

<b>example: </b>, example: 
<div align=left>this is a test</div>, this is a test

本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。

PREG_OFFSET_CAPTURE

如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
如果没有给出标记,则假定为 PREG_PATTERN_ORDER。
返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。

例子 1. 从某文本中取得所有的电话号码

<?php 
preg_match_all ("/\(? (\d)? \)? (?(1) [\-\s] ) \d-\d/x","Call 555-1212 or 1-800-555-1212", $phones); 
?> 

例子 2. 搜索匹配的 HTML 标记(greedy)

<?php
// \\2 是一个逆向引用的例子,其在 PCRE 中的含义是
// 必须匹配正则表达式本身中第二组括号内的内容,本例中
// 就是 ([\w]+)。因为字符串在双引号中,所以需要
// 多加一个反斜线。
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: ".$matches[0][$i]."\n";
echo "part 1: ".$matches[1][$i]."\n";
echo "part 2: ".$matches[3][$i]."\n";
echo "part 3: ".$matches[4][$i]."\n\n";
}
?> 

本例将输出:

matched: <b>bold text</b>
part 1: <b>
part 2: bold text
part 3: </b>
matched: <a href=howdy.html>click me</a>
part 1: <a href=howdy.html>
part 2: click me
part 3: </a>
PHP 相关文章推荐
PHP 单引号与双引号的区别
Nov 24 PHP
PHP开发中的错误收集,不定期更新。
Feb 03 PHP
php获取文件大小的方法
Feb 26 PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
[原创]php实现 data url的图片生成与保存
Dec 04 PHP
PHP对象实例化单例方法
Jan 19 PHP
php redis实现文章发布系统(用户投票系统)
Mar 04 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
php如何获取Http请求
Apr 30 PHP
PHP重载基础知识回顾
Sep 10 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 #PHP
php curl_init函数用法
Jan 31 #PHP
curl实现站外采集的方法和技巧
Jan 31 #PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 #PHP
php使用百度翻译api示例分享
Jan 31 #PHP
php比较两个绝对时间的大小
Jan 31 #PHP
2014过年倒计时示例
Jan 31 #PHP
You might like
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
php操作MongoDB类实例
2015/06/17 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
js查错流程归纳
2012/05/04 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
如何快速上手Vuex
2017/02/14 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python使用matplotlib绘制动画的方法
2015/05/20 Python
浅谈python中set使用
2016/06/30 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
师范大学音乐表演专业求职信
2013/10/23 职场文书
七夕情人节促销方案
2014/06/07 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
预备党员自我评价范文
2015/03/04 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
Mysql 性能监控及调优
2021/04/06 MySQL