PHP正则表达式
定界符通常用’/’作为定界符开始和结束的标记,也可以使用’#’。
哪什么时候使用’/’什么时候使用’#’,当你的’/’较多时,如果你还是用’/’的话,那么转义字符就会非常多,所以用’#’,反过来一样。
修饰符:’i’,’g’,’x’这些加在最后一个定界符的后面,他们各有作用比如’i’用于表示匹配字符串时忽略大小写,’x’表示匹配字符串时忽略空格。
字符域[]:用方括号括起来的部分就是字符域。
限定符:如[a]{3,5}或者[a]*或者[a]+,[a]后面跟着的字符都表示限定符
其中{3, 5}表示3到5个字符,{3,}超过3个字符,{,5}最多5个,{3}表示3个字符
*表示0个到多个
+表示1个到多个
脱字符^:
放在字符域中[^a]表示否定字符选择(样例中说明不能出现a字符)
放在表达式之前表示以当前字符开始进行匹配字符串如’/^abc/’便是以abc这个字符串开始进行匹配。
通配符:
存在两种通配符方式
一种是正向预查?=(可以用?!来表示否定意义),另外一种是反向预查?<=(可以用?<!来表示否定意义),这通配符前后紧跟着字符。
这通配符的主要用法he(?=l)llo其中(?=l)表示he后面必须接l,当然这个(?=l)是不占取任何字符空间的。
捕捉数据
没有指定类型而进行的分组将会被获取,形如\1当然通配符不能算在这个里面。
命名捕获组
格式:(?P=<组名>)调用方式(?P=组名)
惰性匹配:
格式:限定符?--------记住这是格式,限定符就是之前讲的’+’,’*’这些东西
如果前面有限定符,会使用最小的数据,比如*会取0个,+会取1个,一般遵守着能取最小的,就取最小的。
样例代码:
<?php
$pattern = '/hel*?/i';//匹配模式
$str = 'helllllll';//需要匹配的字符串
$matchs = array();
if(preg_match($pattern, $str, $matchs)){//匹配函数调用
var_dump($matchs);
}
?>
达到的效果:
正如我之前做说*这个限定符是从0个到多个,所以?这个字符会导致他们取最小的所以就是零个了,如此he后面的l字符便没有取得。
<?php
$pattern = '/hel+?/i';//匹配模式
$str = 'helllllll';//需要匹配的字符串
$matchs = array();
if(preg_match($pattern, $str, $matchs)){//匹配函数调用
var_dump($matchs);
}
?>
这个和上面那个一样,只是+这个限定符是从1个到多个。
当然用{n,m}这个限定符效果便是大家想的那样。
特殊字符及其效果
字符串对PHP匹配函数的影响
在字符串中’\’这个字符是有特殊含义的所以它的使用要非常慎重。
如下:
如果我们的匹配模式是这样的:
对于这样的字符串:
<a class=\"block_end\" href=\"http://www.1688.com/market/7900000.html\">运动服装 户外服装<\/a>
/<a(?=\s).*?href=\\"(.*?)\\".*?>(.*?)<\\\/a>/i/
那么写成字符串便是:
$pattern = '/<a(?=\\s).*?href=\\\\"(.*?)\\\\".*?>(.*?)<\\\\\/a>/i';
然后用函数preg_match_all()处理匹配字符串。
如此大家要非常注意字符串中’\’这个字符的使用。
其中我再说明()小括号的作用,将匹配字母括在一起表示匹配时保存在matches[1...n]数组里面,而matches[0]数组中保存的是匹配的整字符串,