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.2.0内存管理改进
Jan 22 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
php计算十二星座的函数代码
Aug 21 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
CodeIgniter生成静态页的方法
May 17 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
20个常用Python运维库和模块
2018/02/12 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
PyQt 如何创建自定义QWidget
2021/03/24 Python
国际会计专业求职信
2014/08/04 职场文书
会议欢迎词
2015/01/23 职场文书
材料员岗位职责范本
2015/04/11 职场文书
退休教师追悼词
2015/06/23 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js