PHP 正则表达式常用函数


Posted in PHP onAugust 17, 2014

1.preg_match()

函数原型:int preg_match (string $pattern, string $content [, array $matches])
preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其 中。$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只 作一次匹配,最终返回0或1的匹配结果数。代码6.1给出preg_match()函数的一段代码示例。
代码6.1 日期时间的匹配
代码如下:

<?php 
//需要匹配的字符串。date函数返回当前时间 
$content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together."; 
//使用通常的方法匹配时间 
if (preg_match ("//d{4}-/d{2}-/d{2} /d{2}:/d{2} [ap]m/", $content, $m)) 
{ 
echo "匹配的时间是:" .$m[0]. "/n"; 
} 
//由于时间的模式明显,也可以简单的匹配 
if (preg_match ("/([/d-]{10}) ([/d:]{5} [ap]m)/", $content, $m)) 
{ 
echo "当前日期是:" .$m[1]. "/n"; 
echo "当前时间是:" .$m[2]. "/n"; 
} 
?>

这是一个简单动态文本串匹配实例。假设当前系统时间是“2006年8月17日13点25分”,将输出如下的内容。
匹配的时间是:2006-08-17 01:25 pm
当前日期是:2006-08-17
当前时间是:01:25 pm

2.ereg()和eregi()

ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版 本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则 表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。
代码6.2 文件名的安全检验
代码如下:

<?php 
$username = $_SERVER['REMOTE_USER']; 
$filename = $_GET['file']; 
//对文件名进行过滤,以保证系统安全 
if (!ereg('^[^./][^/]*$', $userfile)) 
{ 
die('这不是一个非法的文件名!'); 
} 
//对用户名进行过滤 
if (!ereg('^[^./][^/]*$', $username)) 
{ 
die('这不是一个无效的用户名'); 
} 
//通过安全过滤,拼合文件路径 
$thefile = "/home/$username/$filename"; 
?>

通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数。

正则表达式的替换

1.ereg_replace()和eregi_replace()

函数原型:string ereg_replace (string $pattern, string $replacement, string $string)
string eregi_replace (string $pattern, string $replacement, string $string)
ereg_replace()在$string中搜索模式字符串$pattern,并将所匹配结果替换 为$replacement。当$pattern中包含模式单元(或子模式)时,$replacement中形如“/1”或“$1”的位置将依次被这些子 模式所匹配的内容替换。而“/0”或“$0”是指整个的匹配字符串的内容。需要注意的是,在双引号中反斜线作为转义符使用,所以必须使用“//0”,“ //1”的形式。
eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小写。代码6.6是本函数的应用实例,这段代码演示了如何对程序源代码做简单的清理工作。
代码6.6 源代码的清理
代码如下:

<?php 
$lines = file('source.php'); //将文件读入数组中 
for($i=0; $i<count($lines); $i++) 
{ 
//将行末以“//”或“#”开头的注释去掉 
$lines[$i] = eregi_replace("(////|#).*$", "", $lines[$i]); 
//将行末的空白消除 
$lines[$i] = eregi_replace("[ /n/r/t/v/f]*$", "/r/n", $lines[$i]); 
} 
//整理后输出到页面 
echo htmlspecialchars(join("",$lines)); 
?>

2.preg_replace()

函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。
代码6.7 数组替换
代码如下:

<?php 
//字符串 
$string = "Name: {Name}<br>/nEmail: {Email}<br>/nAddress: {Address}<br>/n"; 
//模式 
$patterns =array( 
"/{Address}/", 
"/{Name}/", 
"/{Email}/" 
); 
//替换字串 
$replacements = array ( 
"No.5, Wilson St., New York, U.S.A", 
"Thomas Ching", 
"tom@emailaddress.com", 
); 
//输出模式替换结果 
print preg_replace($patterns, $replacements, $string); 
?>

输出结果如下。

Name: Thomas Ching", 
Email: tom@emailaddress.com 
Address: No.5, Wilson St., New York, U.S.A

在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如:
代码如下:

<?php 
$html_body = “<HTML><Body><H1>TEST</H1>My Picture<Img src=”my.gif”></Body></HTML>”; 
//输出结果中HTML标签将全部为小写字母 
echo preg_replace ( 
"/(<//?)(/w+)([^>]*>)/e", 
"'//1'.strtolower('//2').'//3'", //此处的模式变量//2将被strtolower转换为小写字符 
$html_body); 
?>

提示
preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。

PHP 相关文章推荐
php INI配置文件的解析实现分析
Jan 04 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
php将session放入memcached的设置方法
Feb 14 PHP
zf框架db类的分页示例分享
Mar 14 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
PHP操作Redis常用命令的实例详解
Dec 23 PHP
PHP常用正则表达式集锦
Aug 17 #PHP
学习php中的正则表达式
Aug 17 #PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 #PHP
php出现内存位置访问无效错误问题解决方法
Aug 16 #PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 #PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 #PHP
php socket实现的聊天室代码分享
Aug 16 #PHP
You might like
如何写php程序?
2006/12/08 PHP
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
Laravel5中contracts详解
2015/03/02 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
详解Python中的四种队列
2018/05/21 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
网站推广策划方案
2014/06/04 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
父亲节活动策划方案
2014/08/24 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
可可西里观后感
2015/06/08 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python