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边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
php 文本文件的读取效率
Feb 10 PHP
php时间戳格式化显示友好的时间函数分享
Oct 21 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
PHP也能干大事 随机函数
Apr 14 PHP
PHP 获取ip地址代码汇总
Jul 05 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
Sep 29 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 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 作用域解析运算符(::)
2010/07/27 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
详解PHP数组赋值方法
2015/11/07 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
JointJS流程图的绘制方法
2018/12/03 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
一文了解Python并发编程的工程实现方法
2019/05/31 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
python 递归相关知识总结
2021/03/03 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
广告学专业毕业生自荐信
2013/09/24 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
教育实习指导教师评语
2014/12/31 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL