php中的正则表达
在PHP中实现正则一般情况下有两种方式使用PCRE库提供的兼容perl的方式或者使用POSIX的提供的方式。
因为,perg要比POSIX快,所以使用perg方式的。
正则表达式一般实现对字符的,匹配,查找,替换,及分割问题。正则表达式一般有定界符,原子,元子符,模式修正符组成。
定界符:区分正则表达式的,一般使用/,当然也可以使用其他非字母,数字以外的字符,如*,!,|。 例子:/正则表达式/模式匹配符。
原子 :是正则表达式最基本的单位。一般包括字母,数字,特殊字符,如果元子符作为原子需要使用\反斜线转义。
空白字符:
\cX : 匹配由X指明的控制符,如\cM匹配回车符。
\f : 匹配换页符,等价于 \x0c和\xL
\n : 换行符
\r : 回车符
\t : 制表符
\v :垂直制表符
特殊的原子字符:
\D 任意十进制之外的字符,等价于 [^0-9]
\d 十进制字符=[0-9]
\S匹配除空白字符外的任意字符 = [^\f\r\n\t\v]
\s匹配任意空白字符
\W 匹配任意一个字母数字下划线=[0-9_a-zA-Z]
\w 匹配除字母,数字,下划线外的字符。
元子符:在正则中具有特殊意义的字符。
*表示匹配0次或是多次其前的字符 如: ‘/a\s*b/‘ 匹配任意个a和b之间的空白字符。
+表示匹配 一次或是多次其前的字符 如: ‘/a\s+b/‘ a和b之间最少的有一个空白字符。
? 表示匹配0次或是一次其前的字符 如: ‘/a\s+b/‘ a和b之间有一个空白字符或是没有空白字符。
. 表示匹配任意字符 除换行符以外,如果使用模式修正符s可以匹配换行符。 如: ‘/a.b/‘ a和b之间有任意一个字符。
| 匹配分子选择 如: ‘/ab|ax|ac/‘ 匹配ab或是ac,ax。
{N}匹配N次其前的字符
{N,}最少匹配N次其前字符
{N,M}最少匹配N次最多匹配M次其前字符。
^或是\A : 匹配输入字符串的开始位置 如:‘/^this/‘ 匹配以this开头的字符 (如果不使用模式修配符,m,即使字符中有换行符也视为"一行")
$或是\Z匹配字符串的结尾 如:‘/this¥/‘ 匹配以this结尾的字符 (如果不使用模式修配符,m,即使字符中有换行符也视为"一行")
\b 匹配字符的边界 字符串: this is a test; 正则: ‘/\bis\b/‘ 匹配单词is,也就是说is两边不能有其它字符
\B匹配字符边界以外的部分 字符串: this is a test; 正则: ‘/\Bis\b/‘ 可匹配单词this,也就是说is右边不能有其它字符
[] 匹配多个方括号中的原子 [0-9] 匹配十进制数字
[^] 不匹配多个方括号的原子
() 视圆括号的正则为一个小整体,视为模式单元。 如‘/(very)* good/‘
模式单元:
模式单元在正则表达式内的后向引用。因为模式单元视为视为一个小整体,可以在正则表达式内复用,对于这样被()包裹的子表达式,程序在实现的时候会存储在一个临时的缓冲区,并\n,n为数字来编号最大可以编号为99。可以通过使用\n编号来获取使用,在 正则中使用要加上\转义字符相当于\\n。
当想要使用模式单元又不先要存储模式单元的时候可以使用 ?:,?=,?!来忽略相关匹配结果
如: ‘/(Windows)(Linux)\\2os/‘ == ‘/(Windows)(Linux)(Linux)os/‘
‘/(?:Windows)(Linux)\\1os/‘ == ‘/(Windows)(Linux)(Linux)os/‘ 忽略了第一个(Windows)
模式匹配的优先级:
1:\
2: (),(?:),(?!),(?=)
3:*,+,?,{n},{n,},{n,m}
4: ^,$,\b,\B,\A,\Z
5:|
修正符:
模式修正符在定界符之外使用:
i:不区分大小写的匹配 如:‘/ab/i‘ 可以匹配:ab,Ab,aB,AB
m:对于字符串中有换行符的使用m修正符可以视为多行.
字符: this \n is \n a \n test
‘/^is/m‘:因为使用了m修正符,可以匹配到第二行的开头的is ,或者无法匹配第二行is视为一行
s:对于.元子符可以包括换行符。
X:模式中的空白忽略不计。‘/Web Server/ix‘ 可以匹配WebServer忽略空白符。
e:在使用preg_replace函数中,将其作为php代码求值,用其结果来替换所搜索字符。
在使用preg_replace:
匹配日期:
$text = "10/01/2014"; 想要变成"2014-10-01";
$text = preg_replace("/\d{2}\/\d{2}\/\d{4}/","\\3-\\1-\\2",$text);
使用e模式修配符的替换:
$text = "<b>sdfs</b>"; // 想要把<>里的字符变成大写
$text = preg_replace("/(<\/?)(\w+)([^>]*>)/e","‘\\1‘.strtoupper(‘\\2‘).‘\\3‘",$text);
U:非贪婪匹配,如果使用了?并且也使用了U修正符,等同于贪婪模式匹配
‘/a.*e/‘ 匹配字符 "abcdefghjkabcdehjjjabcdekl" ,由于使用了贪婪模式 会从第一个a匹配到最后一个e不会匹配abcde,如果想要取消
‘/a.*e/U‘或是 ‘/a.*?e/‘ ‘/a.*e?/U‘ == 贪婪模式
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。