正则表达式
——一个完整的正则表达式有两部分构成:元字符和文本字符
元字符就是具有特殊含义的字符,文本字符就是普通的文本
行定位符 ‘^’和‘$’
'^'表示行的开始
^tm表示所匹配的字符串tm的开始位置必须是行头,也就是说被匹配的字符串的开头必须是tm
'$'表示行的结束
tm$表示所匹配的字符串tm的开始位置必须是结尾,也就是说被匹配的字符串的结尾必须是tm
单词分界符 ‘\b’和'\B'
'\b'表示匹配的文本必须是单独的单词
\btm\b只能匹配到tm,如html或utmost中的tm就无法匹配
'\B'表示匹配的文本不能是单独的单词
与'\b'正好相反
字符类([])
一个方括号只能匹配一个字符
要匹配不区分大小写的tm可以写作[T|t][M|m]
[0-9]([:digist:])十进制数字集合
[a-zA-Z0-9]([[:alnum:]])字母和数字集合
[a-zA-Z]([[:alpha:]])字母合集
[[;blank:]]刻空格和制表符
[[:xdigit:]十六进制数字
[[:punct:]]特殊字符合集
[[:print:]]可打印字符
[[:space:]]空白字符
[[:graph:]]所有可打印的字符
[A-Z]([[:upper:]])所有大写字母
[a-z]([[:lower:]])所有小写字母
[[:cntrl:]]控制字符
选择字符(|)
(T|t)(M|m)意思是以字母T或t开头,后面接一个字母M或m
连字符(-)
连字符可以表示字符的范围——如:[a-z],[A-Z],[0-9]
排除字符[^]
匹配不符合变量命名规则的变量
[^a-zA-Z]匹配不是以字母和下划线开头的变量名
限定符(?*+{n,m})
?匹配前面的字符零次或一次
colou?r匹配的是color和colour
+匹配前面的字符一次或多次
go+gle匹配的范围是gogle到goo....gle
*匹配前面的字符零次或多次
go*gle匹配的范围是ggle到goo...gle
{n}匹配前面的字符nci
go{2}gle只匹配google
{n,}匹配前面的字符最少n次
go{2,}gle只匹配到google到goo...gle
{n,m}匹配前面的字符最少n次,最多m次
go[2,4]gle只匹配到google,gooogle,goooogle
点号字符(.)
可以匹配出换行符外的任意一个字符
转义字符(\)
与php的转义字符大体一致
反斜线(\)
除了作为转义字符,还有其他功能
反斜线显示的不可打印的字符
\a警报
\b退格
\e Escape
\f换页符
\n换行符
\r回车符
\t水平制表符
\xhh十六进制代码
\ddd八进制代码
\cx即control-x的缩写
反斜线指定的预定义字符集
\d任意一个十进制数字,相当于[0-9] \D任意一个非十进制数 \s任意一个空白字符 \S任意一个非空白字符 \w任意一个单词字符相当于[a-zA-Z0-9] \W任意一个费单词字符
反斜线定义断言的限定符
\b单词分界符 \B非单词分界符序列 \A总是能够匹配待搜索文本的起始位置 \Z表示在未指定任何模式下匹配的字符 \z只匹配字符串的末尾,而不考虑任何换行符 \G当前匹配的其实位置
括号字符(())
小括号字符的第一个作用就是可以匹配改变限定字符的作用范围,如“|”,“*”,“^”
第二个作用是分组
反向引用
依靠子表达式的“记忆”功能来匹配连续出现的字串和字母
(it)\1首先将it作为分组,然后在后面加上"\1"表示匹配连续两个it
模式修饰符
i 忽略大小写模式
M 多文本模式
s 单文本模式
X 忽略空白字符
模式修饰符既可以写在正则表达式的外面,也可以写在表达式内,如忽略大小写模式,可以写为"/tm/i","(?i)tm(?-i)","(?i:tm)三种格式
php正则表达式的函数
//正则调试函数 function display($data = null) { //获取参数类型标识符,转为小写字母 $type = strtolower(gettype($data)); switch ($type) { //如果没有定义,则输出NULL case 'null': echo 'NULL'; break; //如果参数是数组或者对象,就直接格式化输出 case 'array': case 'object': echo '<pre>'; print_r($data); break; //默认为普通变量,则直接输出 default: echo $data; break; } } //$data = range(1,10); //display($data); //php自带的正则验证函数 //preg_match($pattern,$subject,$matches)返回第一次匹配的结果 //preg_match_all($pattern,$subject,$matches) // // //$pattern = '/[0-9]{1,2}/'; //$subject = '0123456789'; //$matches = []; ////preg_match($pattern,$subject,$matches) ////如果匹配成功返回true,否则返回false //if (preg_match($pattern, $subject, $matches)) { // display($matches); //} else { // echo '验证失败'; //} ////preg_match_all()匹配所有的查询结果 //if (preg_match_all($pattern, $subject, $matches)) { // display($matches); //}else{ // echo '验证失败'; //} //preg_grep(string pattern,array input)函数 //函数功能——使用数组input中的元素一一匹配表达式pattern,最后返回所有相匹配的元素所组成的数组 $preg = '/\d{3,4}-?\d{7,8}/'; $arr = array('0432112345678','0431-7654321','12345678'); $preg_arr = preg_grep($preg,$arr); echo var_export($preg_arr,true).'<hr>'; //preg_match()和preg_match_all()函数 //preg_match/preg_match_all(string pattern,string subject,array matches) //函数功能:在字符串subject中匹配表达式pattern。函数返回匹配的次数。如果有数组matches,那么 //每次匹配的结果都将被存储到数组matches中 //preg_match()的返回值为0或1,因为该函数在匹配成功后就停止继续查找了 //preg_match_all()函数则会一只哦匹配到最后才结束 $str = 'This is an example!'; $preg = '/\b\w{2}\b/'; $num1 = preg_match($preg,$str,$str1); echo $num1.'<br>'; echo var_export($str1,true).'<hr>'; $num2 = preg_match_all($preg,$str,$str2); echo '<p>'.$num2.'<br>'; echo var_export($str2,true).'<hr>'; //preg_quote(string str,string delimiter)函数 //函数功能:将字符串str中的所有特殊字符进行自动转义,如果有参数delimiter,那么该函数所包含的字串也将被转义。 //函数返回转义后的字串,如果有参数delimiter,那么该参数所包含的字符串也将被转义 $str = '!、$、^、*、+、.、[、]、\\、/、b、<、>'; $str2 = 'b'; $match_one = preg_quote($str,$str2); echo $match_one.'<hr>'; //preg_replace(pattern,replacement,subject,limit)函数 //函数功能:该函数在字符串subject中匹配表达式pattern,并将匹配项替换成字串replacment,如果有参数limit,则替换limit次 $string = '[b]粗字体[/b]'; $b_rst = preg_replace('/\[b\](.*)\[\/b\]/i','<b>$1</b>',$string); echo $b_rst; //preg_replace_callback(pattern,callback,subject,limit)函数 //与前者类似,多一个回调函数 //preg_split(pattern,subject,limit) //函数功能:使用表达式pattern来分割字符串subject,如果有参数limit,那么数组最多有limit个元素