




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PHP 正则表达式语法(一)正则表达式简介在某些应用中,往往有时候需要根据一定的规则来匹配(查找)确认一些字符串,如要求用户输入的 QQ 号码为数字且至少 5 位。用于描述这些规则的工具就是正则表达式。 最简单的匹配最简单的匹配就是直接给定字符匹配。如用字符 a 去匹配 aabab ,则会匹配出 3 个结果,分别是字符串中的第 1,2 和第 4 个字符。这种匹配是最简单的情况,但往往实际处理中会复杂得多,如下面的 “QQ号码为数字且至少5位” ,其对应的正则表达式为: d5,$该正则表达式就描述需要确定的内容为至少 5 位以上的数字。我们来具体看看该表达式是怎么描述这一规则的: 1. :表示匹配字符串的开始,也即该字符串是独立的开始而不是包含在某个字符串之内 2. d:表示匹配数字 3. 5,:表示至少匹配5位及以上 4. $:表示匹配字符串的结束,也即该字符串是独立的结束 现在就很清楚了,该正则表达式综合起来就是匹配 5 位以上的连续数字,且有独立的开始和结束,对于少于 5 位的数字,或者不是以数字开始和结尾的如 a123456b 这样都是无效的。 从该例子可以看出,正则表达式是从左至右描述的。 同样,如果要匹配移动号码的正则表达式为: 1d10$元字符在上面的例子中, 、d 及 $ 等这些符号,代表了特定的匹配意义,我们称之为元字符,常用的元字符如下: 元字符说明.匹配除换行符意外的任意字符w匹配字母或数字或下划线s匹配任意的空白符d匹配数字b匹配单词的开始或结束匹配字符串的开始$匹配字符串的结束x匹配x字符,如匹配字符串中的 a、b 和 c 字符Ww的反义,即匹配任意非字母,数字,下划线和汉字的字符Ss的反义,即匹配任意非空白符的字符Dd的反义,即匹配任意非数字的字符Bb的反义,即不是单词开头或结束的位置x匹配除了 x 意外的任意字符,如 abc 匹配除了 abc 这几个字母之外的任意字符提示1. 当我们要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用 来表示转义,如要匹配 . 符号,则需要用 . ,否则 . 会被解释成“除换行符外的任意字符”。当然,要匹配 ,则需要写成 2. 连续的数字或字母可以用 符号连接起来,如 匹配所有的小写字母,1-5 匹配 1 至 5 这 5 个数字 3. PHP 正则表达式语法(二)4. 重复5. 正则表达式的威力在于其能够在模式中包含选择和循环,正则表达式用一些重复规则来表达循环匹配。 6. 常用的重复如下: 重复说明*重复零次或更多次+重复 1 次或更多次?重复零次或 1 次n重复 n 次n,重复 n 次或更多次n,m重复 n 到 m 次7. 分枝8. 分枝是指制定几个规则,如果满足任意一种规则,则都当作匹配成功。具体来说就是用 | 符号把各种规则分开,且条件从左至右匹配。 9. 提示10. 由于分枝规定,只要匹配成功,就不再对后面的条件加以匹配,所以如果你想匹配有包含关系的内容,请注意规则的顺序。 11. 下面是一个使用分枝的例子。 12. 美国的邮政编码的规则是 5 个数字或者 5 个数字连上 4 个数字,如 12345 或者 54321-1234 ,如果要匹配所有的邮编,则正确的正则表达式为: 13. d5-d4|d514. /错误写法15. d5|d5-d416. 下面的错误写法,只能匹配到 5 位数字及 9 位数字的前 5 位数字的情况,而不能匹配 9 位数字的邮编。 17. 分组18. 在正则表达式中,可以用小括号将一些规则括起来当作分组,分组可以作为一个元字符来看待。 19. 分组的例子,验证 IP 地址: 20. (d1,3.)3d1,321. 这是一个简单的且不完善的匹配 IP 地址的正则表达式,因为它除了能匹配正确的 IP 地址外,还能匹配如 322.197.578.888 这种不存在的 IP 地址。 22. 当然,用这个表达式简单匹配成功后可以在利用 PHP 的算术比较再加以判断 IP 地址是否正确。而正则表达式中没有提供算术比较功能,如果要完全匹配正确的 IP 地址,则需要改进如下: 23. (250-5|20-4d|01?dd?).)3(250-5|20-4d|01?dd?)24. 规则说明25. 该规则关键之处在于确定 IP 地址每一段范围为 0-255 ,然后再重复 4 次即可。在: 26. 250-5|20-4d|01?dd?27. 中,用分枝首先确定了 250-255 和 200-249 。 01?dd? 则确定了 0-199 的范围,综合起来就是 0-255 。 28. 贪婪与懒惰29. 正则表达式默认的情况下,会在满足匹配条件下尽可能的匹配更多内容。如 a.*b,用他来匹配 aabab ,它会匹配整个 aabab ,而不会只匹配到 aab 为止,这就是贪婪匹配。 30. 与贪婪匹配对应的是,在满足匹配条件的情况下尽可能的匹配更少的内容,这就是懒惰匹配。 31. 上述例子对应的懒惰匹配规则为: 32. a.*?b33. 如果用该表达式去匹配 aabab ,那么就会得到 aab 和 ab 这样两个匹配结果。 34. 常用的懒惰限定符如下: 懒惰限定符说明*?重复任意次,但尽可能少重复+?重复 1 次或更多次,但尽可能少重复?重复 0 次或 1 次,但尽可能少重复n,重复 n 次以上,但尽可能少重复n,m重复 n 到 m 次,但尽可能少重复35. 模式修正符36. 模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明。 37. 常用的模式修正符如下: 模式修正符说明i模式中的字符将同时匹配大小写字母m字符串视为多行s将字符串视为单行,换行符作为普通字符x将模式中的空白忽略epreg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 A强制仅从目标字符串的开头开始匹配D模式中的 $ 元字符仅匹配目标字符串的结尾U匹配最近的字符串u模式字符串被当成 UTF-8PHP 正则表达式匹配 preg_match 与 preg_match_all 函数正则表达式在 PHP 中的应用在 PHP 应用中,正则表达式主要用于: 正则匹配:根据正则表达式匹配相应的内容 正则替换:根据正则表达式匹配内容并替换 正则分割:根据正则表达式分割字符串 在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数。二者差别不大,而且推荐使用Perl 兼容正则表达式函数,因此下文都是以 Perl 兼容正则表达式函数为例子说明。 定界符Perl 兼容模式的正则表达式函数,其正则表达式需要写在定界符中。任何不是字母、数字或反斜线()的字符都可以作为定界符,通常我们使用 / 作为定界符。具体使用见下面的例子。 提示尽管正则表达式功能非常强大,但如果用普通字符串处理函数能完成的,就尽量不要用正则表达式函数,因为正则表达式效率会低得多。关于普通字符串处理函数,请参见PHP 字符串处理。 preg_match()preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。 语法: int preg_match( string pattern, string subject , array matches )参数说明:参数说明pattern正则表达式subject需要匹配检索的对象matches可选,存储匹配结果的数组, $matches0 将包含与整个模式匹配的文本,$matches1 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推例子 1 : 浏览器输出: A match was found: PHP在该例子中,由于使用了 i 修正符,因此会不区分大小写去文本中匹配 php 。 提示preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用 preg_match_all() 函数。 例子 2 ,从一个 URL 中取得主机域名 : 浏览器输出: 域名为:5preg_match_all()preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。 语法: int preg_match_all( string pattern, string subject, array matches , int flags ) 参数说明:参数说明pattern正则表达式subject需要匹配检索的对象matches存储匹配结果的数组flags可选,指定匹配结果放入 matches 中的顺序,可供选择的标记有:1. PREG_PATTERN_ORDER:默认,对结果排序使 $matches0 为全部模式匹配的数组,$matches1 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推 2. PREG_SET_ORDER:对结果排序使 $matches0 为第一组匹配项的数组,$matches1 为第二组匹配项的数组,以此类推 3. PREG_OFFSET_CAPTURE:如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量 下面的例子演示了将文本中所有 标签内的关键字(php)显示为红色。 ?php$str = 学习php是一件快乐的事。所有的phper需要共同努力!;$kw = php;preg_match_all(/(sS*?)/,$str,$mat);for($i=0;$icount($mat0);$i+) $mat0$i = $mat1$i; $mat0$i = str_replace($kw, .$kw., $mat0$i); $str = str_replace($mat1$i, $mat0$i, $str);echo $str;?正则匹配中文汉字正则匹配中文汉字根据页面编码不同而略有区别: GBK/GB2312编码:x80-xff+ 或 xa1-xff+ UTF-8编码:x4e00-x9fa5+/u 例子: 输出: Array( 0 = Array ( 0 = 学习 1 = 是一件快乐的事。 ) )PHP 正则表达式替换 preg_replace 函数正则替换preg_replace() 函数用于正则表达式的搜索和替换。 语法: mixed preg_replace( mixed pattern, mixed replacement, mixed subject , int limit ) 参数说明:参数说明pattern正则表达式replacement替换的内容subject需要匹配替换的对象limit可选,指定替换的个数,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换补充说明1. replacement 可以包含 n 形式或 $n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。 2. 对替换模式在一个逆向引用后面紧接着一个数字时(如 11),不能使用 符号来表示逆向引用。因为这样将会使 preg_replace() 搞不清楚是想要一个 1 的逆向引用后面跟着一个数字 1 还是一个 11 的逆向引用。解决方法是使用 $11。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。 3. 上述参数除 limit 外都可以是一个数组。如果 pattern 和 replacement 都是数组,将以其键名在数组中出现的顺序来进行处理,这不一定和索引的数字顺序相同。如果使用索引来标识哪个 pattern 将被哪个 replacement 来替换,应该在调用 preg_replace() 之前用 ksort() 函数对数组进行排序。 例子 1 : 输出结果为: The-quick-brown-fox-jumped-over-the-lazy-dog.例子 2 ,使用数组: 例子 3 ,使用逆向引用: ?php$str = 5idev其他字符sohu;$pattern = /(sS*?)/i;print preg_replace($pattern, 2, $str);?输出结果为: 5idev其他字符sohuPHP 正则表达式分割 preg_split 与 split 函数preg_split()preg_ split() 函数用于正则表达式分割字符串。 语法: array preg_split( string pattern, string subject , int limit , int flags ) 返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。 参数说明:参数说明pattern正则表达式subject需要匹配分割的对象limit可选,如果指定了 limit ,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制,可以用来继续指定可选参数 flagsflags设定 limit 为 -1 后可选,可以是下列标记的任意组合(用按位或运算符 | 组合):1. PREG_SPLIT_NO_EMPTY:preg_split() 只返回非空的成分 2. PREG_SPLIT_DELIM_CAPTURE:定界符模式中的括号表达式也会被捕获并返回 3. PREG_SPLIT_OFFSET_CAPTURE:对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。 例子 1 : 输出结果为: Array( 0 = php 1 = mysql 2 = apache 3 = ajax)例子 2 : 输出结果为: ( 0 = s 1 = t 2 = r 3 = i 4 = n 5 = g)例子 3 : 输出结果为: Array( 0 = Array ( 0 = php 1 = 0 ) 1 = Array ( 0 = mysql 1 = 4 ) 2 = Array ( 0 = apache 1 = 10 ) 3 = Array ( 0 = ajax 1 = 17 )split()split() 函数同 preg_split() 类似,用正则表达式将字符串分割到数组中,返回一个数组,但推荐使用 preg_split() 。 语法: array split( string pattern, string string , int limit )如果设定了 limit ,则返回的数组最多包含 limit 个单元,而其中最后一个单元包含了 string 中剩余的所有部分。如果出错,则返回 FALSE。 例子: 输出结果: Array( 0 = 2008 1 = 08 2 = 08 3 = 20 4 = 00 5 = 01)提示1. 如果不需要正则表达式的功能,可以选择使用更快(也更简单)的替代函数如 explode() 或 str_split() 。 2. split() 函数对大小写敏感,如果在匹配字母字符时忽略大小写的区别,请使用用法相同的 spliti() 函数 PHP 常用正则表达式整理本文整理了常用的正则表达式以供参考,尽管以下正则表达式已经一一经过验证,但难免有所纰漏,大家在使用时还需要仔细验证。 表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:a-zA-Za-zA-Z0-9_4,15$ 验证账号,不能为空,不能有空格,只能是英文字母:S+a-z A-Z$ 验证账号,不能有空格,不能非数字:d+$ 验证用户密码,以字母开头,长度在 6-18 之间:a-zA-Zw5,17$ 验证是否含有 %&,;=?$ 等字符:%&,;=?$x22+ 匹配Email地址:w+(-+.w+)*w+(-.w+)*.w+(-.w+)* 匹配腾讯QQ号:1-90-94, 匹配日期,只能是 2004-10-22 格式:d4-d1,2-d1,2$ 匹配国内电话号码:d3-d8|d4-d7,8$评注:匹配形式如或或匹配中国邮政编码:1-9d5(?!d)$ 匹配身份证:d14(d4|(d3xX)|d1)评注:中国的身份证为 15 位或 18 位 不能为空且二十字节以上:s|S20,$ 字符匹配匹配由 26 个英文字母组成的字符串:A-Za-z+$ 匹配由 26 个大写英文字母组成的字符串:A-Z+$ 匹配由 26 个小写英文字母组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出租屋管理安全培训课件
- 文库发布:出师表课件
- 出国安全培训制度课件
- 2025年长期供货合同范本-涂料供应合同
- 出口许可证课件
- 冲积扇形成原因课件
- 2025全新升级计算机辅助卓越二手房买卖中介服务合同
- 2025农药买卖合同(除草剂)
- 2025上海市地方标准《融资租赁服务合同规范》编制说明
- 2025合同样本:健身房合作经营合同律师起草专业版
- 成考学位日语试题及答案
- 2024年重庆机场集团有限公司招聘笔试真题
- 健康体检信息系统软件需求规格说明书
- 微生物组与卵巢癌关联-全面剖析
- 2025中国新型储能行业发展白皮书
- 《投标文件产品质量保证措施:方案与实施》
- 五金零售行业O2O模式研究-全面剖析
- 2025年乡村医生考试题库:常见疾病诊疗与社区医疗管理试题试卷
- 2024年鲁科版三年级英语上册单词表
- 《抗日战争课件》课件
- 儿童心理健康的饮食疗法探索
评论
0/150
提交评论