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 相关文章推荐
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
php多文件上传下载示例分享
Feb 20 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
Oct 17 PHP
php生成shtml类用法实例
Dec 09 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
composer.lock文件的作用
Feb 03 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
laravel 如何实现引入自己的函数或类库
Oct 15 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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 一元分词算法
2009/11/30 PHP
php URL验证正则表达式
2011/07/19 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
python图像处理之镜像实现方法
2015/05/30 Python
Python while 循环使用的简单实例
2016/06/08 Python
Python生成密码库功能示例
2017/05/23 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Python实现井字棋小游戏
2020/03/09 Python
Python request使用方法及问题总结
2020/04/26 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
PyQt5实现画布小程序
2020/05/30 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
个人能力自我鉴赏
2014/01/25 职场文书
旅游市场营销方案
2014/03/09 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
扬州个园导游词
2015/02/06 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python