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模拟HTTP认证
Oct 09 PHP
黑夜路人出的几道php笔试题
Aug 04 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
PHP常见数组排序方法小结
Aug 20 PHP
mongodb和php的用法详解
Mar 25 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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实现文件安全下载
2006/10/09 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
js option删除代码集合
2008/11/12 Javascript
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python学习教程之使用py2exe打包
2017/09/24 Python
使用python实现BLAST
2018/02/12 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
Django中使用Celery的方法示例
2018/11/29 Python
Python3爬虫全国地址信息
2019/01/05 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
《草原的早晨》教学反思
2014/04/08 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
单位工作证明格式模板
2014/10/04 职场文书
应聘教师求职信范文
2015/03/20 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
python使用shell脚本创建kafka连接器
2022/04/29 Python