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 相关文章推荐
ADODB类使用
Nov 25 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
PHP安全性漫谈
Jun 28 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
php fread读取文件注意事项
Sep 24 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
CI框架网页缓存简单用法分析
Dec 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中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
原生JavaScript实现留言板
2021/01/10 Javascript
用python 制作图片转pdf工具
2015/01/30 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
python打造爬虫代理池过程解析
2019/08/15 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
python检测服务器端口代码实例
2019/08/31 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
工程项目建议书范文
2014/03/12 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书