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 相关文章推荐
php5 mysql分页实例代码
Apr 10 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
PHP操作MongoDB时的整数问题及对策说明
May 02 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
codeigniter实现get分页的方法
Jul 10 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
php使用正则验证中文
Apr 06 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 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 iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
Angular中的$watch方法详解
2017/09/18 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
python 系统调用的实例详解
2017/07/11 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
python中class的定义及使用教程
2019/09/18 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
财务情况说明书范文
2014/05/06 职场文书
内科护士节演讲稿
2014/09/11 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang