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音乐采集(部分代码)
Feb 14 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
php修改时间格式的代码
May 29 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
php post换行的方法
Feb 03 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
PHP实现抽奖功能实例代码
Jun 30 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
解析MySql与Java的时间类型
2013/06/22 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
Python标准库与第三方库详解
2014/07/22 Python
Python常用算法学习基础教程
2017/04/13 Python
Python中常用信号signal类型实例
2018/01/25 Python
基于python实现百度翻译功能
2019/05/09 Python
python如何把字符串类型list转换成list
2020/02/18 Python
Python中求对数方法总结
2020/03/10 Python
python 下载文件的多种方法汇总
2020/11/17 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
普通简短的个人自我评价
2014/02/15 职场文书
红头文件任命书范本
2014/06/05 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
业务员管理制度范本
2015/08/06 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android