很久之前就接触过正则表达式,但一直没有系统的去学习,今天看了一些关于PHP正则表达式的视频后,把学习的知识记录下来,以备后用。
PHP的正则有两类,一类是PCRE(兼容Perl),在PHP中以preg开头的函数,另一类是POSIX Regex,这套正则已经过时,不建议使用。
关于PCRE(兼容Perl)的说明:
1、定界符
2、原子
原子即要匹配的内容,如要匹配3,那3就是原子,要匹配bbb,bbb就是原子;也可以用转义符号来表示一组要匹配的内容,如\d代表匹配所有数字,这时\d就是原子。 需要注意的是,在一个正则表达式中,至少要有一个原子。1)、原子包含什么
原子包含打印字符和非打印字符。打印字符可以理解为键盘上能打出来的字符,如a-zA-Z~!@#$%^等等;非打印字符比如回车、制表符等
2)、转义字符(\)的作用
a、将有意义的字符转成没有意义的原子字符,如匹配^,要写成\^,因为^是一个有意义的字符
b、将没有意义的字符转成有意义的原子字符,如匹配回车,要写成\n
c、假如一个字符加上转义符后也没有其他意义,这时加不加都是一样的效果,如\h,这个是没有意义的,所以\h与h表示的都是字符h
3)、匹配多个原子
a、系统提供的:
\d | 代表任意一个数字的字符,如/\d/ | \D | 代表任意一个非数字的字符,如/\D/ |
\w | 代表任意一个字的字符,a-zA-Z0-9_,如/\w/ | \W | 代表任意一个非字的字符,除了a-zA-Z0-9_外的所有字符,如*-+/ |
\s | 代表任意一个空白的字符,如回车、空格、制表符等 | \S | 代表任意一个非空白非的字符,如除了回车、空格、制表符等的字符 |
b、用户可自定义的:
单独指定要匹配的字符,如匹配13579,则写[13579]
匹配范围:如匹配所有字母的字符,则写[a-zA-Z],其中-是一个区间范围
匹配不在范围:如匹配除了所有字母的字符,则写[^a-zA-Z],其中^是除了的意思
匹配所有原子,则写.
3、元字符
元字符不能单独使用,是用来修饰原子,扩展原子功能和限定功能的,要写在定界符里面。如3{3},{3}就是元字符,表示查找333。
元字符表:
* | 修饰其前的原子出现0次、1次或多次,必需放在原子后面,可以理解为{0,} | + | 修饰其前的原子出现1次或多次,即至少要出现一次,必需放在原子后面,可以理解为{1,} |
? | 修饰其前的原子出现0次或1次,必需放在原子后面,可以理解为{0,1} | {n} | n代表数字,表示其前的原子只能出现n次,必需放在原子后面 |
{n,m} | n和m代表数字,表示其前的原子至少出现n次,最多出现m次,必需放在原子后面。 表示两边的原子只要有一个出现就可以满足,但是|优先级是最低的,如果想改变优先级,可以用括号() | {n,} | n代表数字,表示其前的原子出现不小于n次,必需放在原子后面 |
| | 匹配两个或多个分支选择,或者的关系 | ^或\A | 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后),必需写在正则表达式的最前面。 如/^abc/表示以abc开头的字符串 |
$或\Z | 匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行符之前)必需写在正则表达式的最后面。 如:/abc$/表示以abc结束的字符串 | \b | 匹配单词的边界 |
\B | 匹配除单词边界以外的部分。 如:字符串this is island,这里面有3个is 表达式为:/\bis\b/,会匹配出中间的is。 表达式为:/\bis\B/,会匹配出island中的is。 表达式为:/\Bis\b/,会匹配出this中的is。 | () | 1、改变优先级别 2、将小原子变成大原子 如/mysql+/表示mysq后面的l要出现一次或多次,但如果是/(mysql)+/,表示mysql这个单词要出现一次或多次 3、子模式,整个表达式是一个大的模式,小括号中的是每个独立的子模式 如:字符串this http://www.xxx.com mysqloracle,表达式为:/(http|https|ftp)\:\/\/(www)\.(.*?)\.(com|net|org)/ 这样在正则之后的结果,可以将每个括号的中的内容单独提取出来 4、反向引用 如:字符串:this 2014-11-05 mysqloracle,表达式为:/\d{4}-\d{2}-\d{2}/,这时可以匹配出来日期2014-11-05 但如果日期改变2014/11/05,就无法匹配出来,可以将表达式改为/\(d{4})(-|\/)\d{2}(-|\/)\d{2}/ 但这时日期格式如果为2014/11-05也可以匹配出来,所以可以将子模式反过来用在正则表达式里面, 即将表达式改为/\(d{4})(-|\/)\d{2}\1\d{2}/,其中\1代表取出第1个子模式里面的内容, 在这里为-或/ 5、如果想将括号的功能作为改变优先级和将小原子变成大原子使用,而不要让它产生子模式和反向引用的作用,可以在(后面加上?: 如:/\(?:d{4})(-|\/)\d{2}(-|\/)\d{2}/,这样匹配出来的2014就不会变成子模式中的一部分 |
4、模式修正符(模式修饰符)
模式修正符用来对模式(正则)修正用的,用来修正正则表达式的解释或扩充正则表达式的功能。
1)、模式修正符要写在定界符外面,放在右边。如/b{3}/i,其中i就是模式修正符,这是里表示不区分大小写。
2)、模式修正符中,一个字符是一个功能,可以组合使用,不分先后顺序。如:/go*gle/ieU
常用修正符表:
i | 不区分大小定,默认是区分大小写的 |
m | 将字符串为多行,当在使用^或$时,每一行满足条件都可以,默认将字符串视为一行处理 |
s | 修正正则表达式中的.可以匹配换行符,默认.不能匹配回车换行 |
x | 可以省略正则表达式中的空白处 |
e | 与preg_replace配合使用 |
u | 取消正则表达式的贪婪模式 如:字符串为this is <b>test</b> web <b>server</b>,表达式为/\<b\>(.*)\<\/b\>/i 这里取到的结果为test</b> web <b>server,与想要的结果不符,这时可以使用U修正符 但这种符号与perl不兼容,可以用另一种方式来取消贪婪模式 可以用/\<b\>(.*?)\<\/b\>/i来取消贪婪模式 |