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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
php存储过程调用实例代码
Feb 03 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
PHP实现仿Google分页效果的分页函数
Jul 29 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
如何离线执行php任务
Feb 21 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
详解PHP神奇又有用的Trait
Mar 25 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数组函数
2008/08/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP自定义多进制的方法
2016/11/03 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
jquery 分页控件实现代码
2009/11/30 Javascript
input的focus方法使用
2010/03/13 Javascript
JS实现self的resend
2010/07/22 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
使用Python对SQLite数据库操作
2017/04/06 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python实现多张图片拼接成大图
2019/01/15 Python
WxPython建立批量录入框窗口
2019/02/27 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
总经理驾驶员岗位职责
2013/12/04 职场文书
优秀干部获奖感言
2014/01/31 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2014年基建工作总结
2014/12/12 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python