php小经验:解析preg_match与preg_match_all 函数


Posted in PHP onJune 29, 2013

正则表达式在 PHP 中的应用
在 PHP 应用中,正则表达式主要用于:
•正则匹配:根据正则表达式匹配相应的内容
•正则替换:根据正则表达式匹配内容并替换
•正则分割:根据正则表达式分割字符串
在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数。二者差别不大,而且推荐使用Perl 兼容正则表达式函数,因此下文都是以 Perl 兼容正则表达式函数为例子说明。
定界符
Perl 兼容模式的正则表达式函数,其正则表达式需要写在定界符中。任何不是字母、数字或反斜线()的字符都可以作为定界符,通常我们使用 / 作为定界符。具体使用见下面的例子。
提示
尽管正则表达式功能非常强大,但如果用普通字符串处理函数能完成的,就尽量不要用正则表达式函数,因为正则表达式效率会低得多。关于普通字符串处理函数。
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
语法:
int preg_match( string pattern, string subject [, array matches ] )
参数说明:

参数 说明
pattern 正则表达式
subject 需要匹配检索的对象
matches 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
例子 1 :
<?php
if(preg_match("/php/i", "PHP is the web scripting language of choice.", $matches)){
    print "A match was found:". $matches[0];
} else {
    print "A match was not found.";
}
?>

浏览器输出:
A match was found: PHP

在该例子中,由于使用了 i 修正符,因此会不区分大小写去文本中匹配 php 。
提示
preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用 preg_match_all() 函数。
例子 2 ,从一个 URL 中取得主机域名 :
<?php
// 从 URL 中取得主机名
preg_match("/^(http://)?([^/]+)/i","https://3water.com/index.html", $matches);
$host = $matches[2];
// 从主机名中取得后面两段
preg_match("/[^./]+.[^./]+$/", $host, $matches);
echo "域名为:{$matches[0]}";
?>

浏览器输出:
域名为:3water.com

preg_match_all()
preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
语法:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
参数说明:
参数 说明
pattern 正则表达式
subject 需要匹配检索的对象
matches 存储匹配结果的数组
flags 可选,指定匹配结果放入 matches 中的顺序,可供选择的标记有: PREG_PATTERN_ORDER:默认,对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推 PREG_SET_ORDER:对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推 PREG_OFFSET_CAPTURE:如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量
下面的例子演示了将文本中所有 <pre></pre> 标签内的关键字(php)显示为红色。
<?php
$str = "<pre>学习php是一件快乐的事。</pre><pre>所有的phper需要共同努力!</pre>";
$kw = "php";
preg_match_all('/<pre>([sS]*?)</pre>/',$str,$mat);
for($i=0;$i<count($mat[0]);$i++){
    $mat[0][$i] = $mat[1][$i];
    $mat[0][$i] = str_replace($kw, '<span style="color:#ff0000">'.$kw.'</span>', $mat[0][$i]);
    $str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?>

正则匹配中文汉字
正则匹配中文汉字根据页面编码不同而略有区别:
•GBK/GB2312编码:[x80-xff>]+ 或 [xa1-xff]+
•UTF-8编码:[x{4e00}-x{9fa5}]+/u
例子:
<?php
$str = "学习php是一件快乐的事。";
preg_match_all("/[x80-xff]+/", $str, $match);
//UTF-8 使用:
//preg_match_all("/[x{4e00}-x{9fa5}]+/u", $str, $match);
print_r($match);
?>

输出:
Array
(
    [0] => Array
        (
            [0] => 学习
            [1] => 是一件快乐的事。
        ))
PHP 相关文章推荐
用PHP连接Oracle for NT 远程数据库
Oct 09 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 #PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 #PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 #PHP
解析php中的escape函数
Jun 29 #PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 #PHP
php获取数组中重复数据的两种方法
Jun 28 #PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 #PHP
You might like
浅谈php和js中json的编码和解码
2016/10/24 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
浅谈js闭包理解
2019/03/28 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
深入解析Python中的urllib2模块
2015/11/13 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
Python如何调用JS文件中的函数
2019/08/16 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
WiFi云数码相框:Nixplay
2018/07/05 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
连锁经营管理专业大学生求职信
2013/10/30 职场文书
校园活动策划书范文
2014/01/10 职场文书
酒店营销策划方案
2014/02/07 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
Mysql文件存储图文详解
2021/06/01 MySQL
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技
python中mongodb包操作数据库
2022/04/19 Python
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python