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 26 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
Laravel 5 学习笔记
Mar 06 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
php批量删除超链接的实现方法
Oct 19 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 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
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
在django view中给form传入参数的例子
2019/07/19 Python
python画微信表情符的实例代码
2019/10/09 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
什么是servlet链?
2014/07/13 面试题
安全生产责任书范本
2014/04/15 职场文书
个人工作表现自我评价
2015/03/06 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏