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学习之PHP变量
Oct 09 PHP
PHP 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
php中instanceof 与 is_a()区别分析
Mar 03 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
Mar 14 PHP
CI框架数据库查询之join用法分析
May 18 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
PHP中的Trait 特性及作用
2016/04/03 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
Seajs源码详解分析
2019/04/02 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
UNIX文件系统分类
2014/11/11 面试题
幼儿园五一活动方案
2014/02/07 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL