<?php
PHP 中的正则表达式
==========================================================
1. 正则表达式简介
1.1 什么是正则
1. /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+){0,3}$/ 就是正则
2.正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。
3.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。
1.2 正则表达式的作用
1.匹配,也常常用于从字符串中析取信息。
2.用新文本代替匹配文本。
3.将一个字符串拆分为一组更小的信息块。
1.3 学习正则的流程
1.语法学习
2.函数学习
1.4 正则的故事
1.在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:
一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数;
一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以“ereg_”为前缀命名的函数;
2.PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。
3.PCRE语法支持更多特性,比POSIX语法更强大。
1.5 与Perl语言兼容的正则表达式处理函数
preg_match() 进行正则表达式匹配
preg_match_all() 进行全局正则表达式匹配
preg_replace() 执行正则表达式的搜索和替换
preg_split() 用正则表达式分割字符串
preg_grep() 返回与模式匹配的数组单元
preg_replace_callback() 用回调函数执行正则表达式的搜索和替换
2. 正则表达式的语法规则
2.1 定界符
1.在程序语言中,使用与Perl兼容的正则表达式,通常都需要将模式表达式放入定界符之间,如“/”。
2.作为定界的字符也不仅仅局限于“/”。除了字母、数字和斜线“\”以外的任何字符都可以作为定界符,像 ‘#’、’|’、’!’ 等都可以的。
2.2 原子
原子是正则表达式的最基本的组成单元,而且在每个模式中最少要少包含一个原子。
1. 普通字符作为原子: 如 a~z、A~Z、0~9 等
2. 一些特殊字符和转义后元字符作为原子:
所有标点符号,但语句特殊意义的符号需要转义后才可作为原子,如:\” \’ \* \+ \? \. 等
3. 一些非打印字符作为原子:
如:\f \n \r \t \v \cx
原子字符含义描述
\cx匹配由x指明的控制字符。如\cM匹配一个Control-M或回车符。x的值必须为A~Z或a~z之一。
\f匹配一个换页符。等价于 \x0c或\cL
\n匹配一个换行符。等价于 \x0a或\cJ
\r匹配一个回车符。等价于 \x0d或\cM
\t匹配一个制表符。等价于 \x09或\cI
\v匹配一个垂直制表符。等价于 \x0b或\cK
4. 使用“通用字符类型”作为原子:如:\d \D \w \W \s \S。
原子字符含义描述
\d匹配任意一个十进制数字,等价于[0-9]
\D匹配任意一个除十进制数字以外的字符,等价于[^0-9]
\s匹配任意一个空白符,等价于[\f\n\r\t\v]
\S匹配除空白符以外任何字符,等价于[^\f\n\r\t\v]
\w匹配任意一个数字、字母或下画线,等价于[0-9a-zA-Z_]
\W匹配一个除数字、字母或下画线以外的任意一个字符,等价于[^0-9a-zA-Z_]
5. 自定义原子表([])作为原子:如:’/[apj]sp/’ ’/[^apj]sp/’ [] [^]
2.3 元字符
元字符含义描述
*匹配0次、1次或多次其前的原子
+匹配1次或多次其前的原子
?匹配0次或1次其前的原子
.匹配除了换行符外的任意一个字符
|匹配两个或多个分支选择
{n}表示其前面的原子恰好出现n次
{n,}表示其前面的原子出现不小于n次
{n,m}表示其前面的原子至少出现n次,最多出现m次
^或\A匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后)
$或\Z匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行符之前)
\b匹配单词的边界
\B匹配除单词边界以外的部分
[]匹配方括号中指定的任意一个原子
[^]匹配除方括号中的原子以外的任意一个字符
( )匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子
1. 字符串边界限制
元字符“^”或“\A” 置于字符串的开始确保模式匹配出现在字符串首端;
元字符“$”或“\Z” 置于字符串的结束,确保模式匹配出现字符串尾端。
2. 单词边界限制
元字符“\b”对单词的边界进行匹配;
元字符“\B”对除单词边界以外的部分进行匹配。
3. 重复匹配
元字符“?”:表示0次或1次匹配紧接在其前的原子。
元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。
元字符“+”:表示1次或多次匹配紧接在其前的原子。
4. 任何一个字符
元字符“.”匹配除换行符外任何一个字符。
通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。
5. 重复匹配
元字符“{ }”准确地指定原子重复的次数,指定所匹配的原子出现的次数。
“{m}” 表示其前原子恰好出现m次。
“{m,n}”表示其前原子至少出现m次,至多出现n次。
“{m,}” 表示其前原子出现不少于m次。
6. 原子表 -方括号表达式
原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。
原子表 ”[^]” 或者称为排除原子表,匹配除表内原子外的任意一个字符。
原子表“[-]”用于连接一组按ASCII码顺序排列的原子,简化书写。
7. 模式选择符
元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。
8. 模式单元
元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。
9. 重新使用的模式单元
系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“\1”、“\2”、“\3”的形式进行引用。
当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“\\1”、“\\2”
当不需要存储匹配结果时使用非存储模式单元“(?:)”
例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。
10. 模式匹配优先级
顺序元字符描述
1\转义字符
2() (?:) (?=) []模式单元和原子表
3* + ? {n} {n,} {n,m}重复匹配
4^ $ \b \B \A \Z边界限制
5|模式选择
2.4 模式修正符
修正符含义描述
i在和模式进行匹配时不区分大小写
m将字符串视为多行。默认的正则开始“^”和结束“$”将目标字符串作为单一的一“行”字符。加上m后,那么开始和结束将会指字符串的每一行。
s如果设定了此修正符,模式中的圆点元字符“.”匹配所有的字符,包括换行符。即将字符串视为单行,换行符作为普通字符看待
x模式中的空白忽略不计,除非它已经被转义
e只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
U本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (U) 修正符或者在数量符之后跟一个问号(如启.*?)来用此选项。
3. 与Perl兼容的正则表达式函数
3.1 子符串的匹配与查找函数
preg_match() 只匹配一次,返回匹配的次数0或1
preg_match_all() 返回0或匹配到字符的个数
preg_grep()
3.2 字符串的替换函数
preg_replace()
preg_replace_callback()
preg_filter()
3.3 字符串的分割与连接
preg_split()
3.4 其他
preg_quote()
preg_last_error()
好用的正则工具http://regexpal.isbadguy.com/
本文为Davidvivi原创文章,转载无需和我联系,但请注明来自Davidvivi博客weixia.xin 本人微信:ww646904527,备注博客