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 相关文章推荐
php a simple smtp class
Nov 26 PHP
php Ajax乱码
Apr 09 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
joomla数据库操作示例代码
Jan 06 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
php链式操作的实现方式分析
Aug 12 PHP
laravel框架中控制器的创建和使用方法分析
Nov 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
php fckeditor 调用的函数
2009/06/21 PHP
PHP实现的购物车类实例
2015/06/17 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
js图片翻书效果代码分享
2015/08/20 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
python使用str &amp; repr转换字符串
2016/10/13 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
python如何统计代码运行的时长
2019/07/24 Python
python sorted函数的小练习及解答
2019/09/18 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
2014年感恩母亲演讲稿
2014/05/27 职场文书
电影建国大业观后感
2015/06/01 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL