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 页面编码声明方法详解(header或meta)
Mar 12 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
php简单防盗链实现方法
Jul 29 PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 PHP
php无限分类使用concat如何实现
Nov 05 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 PHP
如何在PHP中生成随机数
Jun 04 PHP
PHP队列场景以及实现代码实例详解
Feb 26 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经典面试题之设计模式(经常遇到)
2015/10/15 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
python中json格式数据输出的简单实现方法
2016/10/31 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
详解Python多线程下的list
2020/07/03 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
护理专业学生职业生涯规划范文
2014/03/11 职场文书
元旦联欢会主持词
2014/03/26 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
鲁迅故居导游词
2015/02/05 职场文书
不同意离婚代理词
2015/05/23 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL