PHP中的正规表达式(一)


Posted in PHP onOctober 09, 2006

PHP中的正规表达式(一)
Hunte 2000年4月14日

PHP继承*NIX的一贯传统,完全支持正规表达式的处理。正规表达式提供了一种高级的,但不直观的字符串匹配和处理的方法。用过PERL的正规表达式的朋友都知道,正规表达式的功能非常强大,但学起来不是那么容易。
比如:

^.+@.+\\..+$

这段有效却难以理解的代码足够使一些程序员头痛(我就是)或者让他们放弃使用正规表达式。相信当你读完这个教程后,就可以理解这段代码的含义了。

基本模式匹配

一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:

^once

这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。

bucket$

这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:

^bucket$

只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式

once

与字符串

There once was a man from NewYork
Who kept all of his cash in a bucket.

是匹配的。

在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:

^\t

类似的,用\n表示“新行”,\r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用\.表示,以此类推。

字符簇

在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。

所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:

[AaEeIiOoUu]

这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:

[a-z] //匹配所有的小写字母
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符

同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:

^[a-z][0-9]$

尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。

前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:

^[^0-9][0-9]$

这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:

[^a-z] //除了小写字母以外的所有字符
[^\\\/\^] //除了(\)(/)(^)之外的所有字符
[^\"\'] //除了双引号(")和单引号(')之外的所有字符

特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。

PHP的正规表达式有一些内置的通用字符簇,列表如下:

字符簇 含义
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

PHP 相关文章推荐
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
php修改指定文件后缀的方法
Sep 11 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
Mar 14 PHP
PHP中的正规表达式(二)
Oct 09 #PHP
smtp邮件发送一例
Oct 09 #PHP
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
Oct 09 #PHP
PHP+javascript液晶时钟
Oct 09 #PHP
一个分页的论坛
Oct 09 #PHP
一个简易需要注册的留言版程序
Oct 09 #PHP
使用数据库保存session的方法
Oct 09 #PHP
You might like
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
Javascript的this用法
2017/01/16 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
小学生安全演讲稿
2014/04/25 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书