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 相关文章推荐
解决中英文字符串长度问题函数
Jan 16 PHP
php学习 字符串课件
Jun 15 PHP
php摘要生成函数(无乱码)
Feb 04 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
分享php邮件管理器源码
Jan 06 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
Yii2框架制作RESTful风格的API快速入门教程
Nov 08 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
laravel 框架配置404等异常页面
Jan 07 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 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
SSI指令
2006/11/25 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
python多线程用法实例详解
2015/01/15 Python
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
对Django中内置的User模型实例详解
2019/08/16 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
酒店人事专员岗位职责
2013/12/19 职场文书
师范生求职自荐信
2014/06/14 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
工人先进事迹材料
2014/12/26 职场文书
企业介绍信范文
2015/01/30 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android