什么是正则表达式
一种描述字符串结构的语法规则,
一种特定的格式化模式
可以匹配、替换、截取匹配的字符串
正则表达式语法规则
一个完整的正则表达式由元字符和文本字符两部分构成
元字符是具有特定含义的字符,
如:“*”和“?”
文本字符就是普通的文本
如:字母和数字
行定位符
“^”和“$”
描述字串的边界
^为行的开始
$为行的结尾
^tm
匹配以tm开头的字串
tm$
匹配以tm结尾的字串
tm
单词分界符
“\b”
使用单词分界符“\b”查找内容为tm的字串
\btm\b
\B是匹配内容中有tm的单词
\Btm\B
字符类
“[]”
正则表达式区别大小写,可以用“[]”忽略大小写
把匹配的字符放在[]中
[Tt][Mm]
选择字符
“|”
也可以实现忽略大小写
使用“|”
该字符也可以理解成或
(T|t)(M|m)
连字符
“-”
连字符解决了变量的命名只能以字母和下画线开头的问题
[a,b,c,d...A,B,C,D...][a-zA-Z]//与上式等同
排除字符
“[^]”
匹配不符合命名规则的变量
将行开始的符号放在括号里表示排除的意思
匹配不以字母和下画线开头的变量名
[^a-zA-Z]
限定符
对于重复出现的字符或字串使用限定符匹配
| 限定符 | 说明 | 举例 |
|---|---|---|
| ? | 匹配前面的字符零次或一次 | colou?r,该表达式可以匹配colour和color |
| + | 匹配前面的字符一次或多次 | go+gle,该表达式可以匹配从gogle到goo…gle |
| * | 匹配前面的字符零次或多次 | go*gle,该表达式可以匹配从ggle到goo…gle |
| {n} | 匹配前面的字符n次 | go{2}gle,该表达式只能匹配google |
| {n,} | 匹配前面的字符最少n次 | go{2,}gle,该表达式可以匹配从google到goo…gle |
| {n,m} | 匹配前面的字符最少n次,最多m次 | employe{0,2},该表达式可以匹配employ,employe和employee |
点数字符
“.”
匹配出除了换行符以外的任意一个字符
例如:匹配以s开头,t结尾
^s.t$
匹配以s开头,第三个字符为s,最后一个字符为t
^s.s.t$
转义字符
“\”
例如:匹配一个IP地址127.0.0.1
[0-9]{1,3}(\.[0-9]{1,3}){3}
反斜线
将一些不可打印的字符显示
| 字符 | 说明 |
|---|---|
| \a | 警报,即ASCII中的 |
| \b | 退格,即ASCII中的 |
| \e | Escape,即ASCII中的 |
| \f | 换页符,即ASCII中的 |
| \n | 换行符,即ASCII中的 |
| \r | 回车符,即ASCII中的 |
| \t | 水平制表符,即ASCII中的 |
| \xhh | 十六进制代码 |
| \ddd | 八进制代码 |
| \cx | 即control-x的缩写,匹配由x指明的控制字符,其中x是任意字符 |
预定义字符集
| 预定义字符集 | 说明 |
|---|---|
| \d | 任意一个十进制数字,相当于[0-9] |
| \D | 任意一个非十进制数字 |
| \s | 任意一个空白字符(空格、换行符、换页符、回车符、水平制表符),相当于[\f\n\r\t] |
| \S | 任意一个非空白字符 |
| \w | 任意一个单词字符,相当于[a-zA-Z0-9_] |
| \W | 任意一个非单词字符 |
定义断言
| 限定符 | 说明 |
|---|---|
| \b | 单词分界符,匹配字符串中的某些位置,“\b”是以统一的分界符来匹配 |
| \B | 非单词分界符序列 |
| \A | 总是能匹配待搜索文本的起始位置 |
| \Z | 表示在未指定任何模式下匹配的字符,通常是字符串的末尾位置或者是末尾位置换行符之前的位置 |
| \z | 只匹配字符串的末尾 |
| \G | 当前匹配的起始位置 |
括号字符
“()”
改变限定符的作用范围
(six|four)th//匹配sixth或fourthsix|fourth//匹配six和fourth
分组
(\.[0-9]{1,3}){3}//对分组(\.[0-9]{1,3})进行三次操作
反向引用
匹配连续出现的字符或字母
(it)\1([a-z])([A-Z])\1\2
自己指定分组名称
格式:
(?P
反向引用分组
(?P=subname)
(?P<fir>[a-z])(?P<sec>[A-Z])(?P=fir)(?P=sec)
模式修饰符
设定模式,即规定正则表达式该如何解释和应用
| 修饰符 | 表达式写法 | 说明 |
|---|---|---|
| i | (?i)…(?-i)、(?i:…) | 忽略大小写模式 |
| m | (?m)…(?-m)、(?m:…) | 多文本模式。即字符串内部有多个换行符的时候影响“^”和“$”的匹配 |
| s | (?s)…(?-s)、(?s:…) | 单文本模式。仅在此模式下,“.”可以匹配换行符。 |
| x | (?x)…(?-x)、(?x:…) | 忽略空白字符 |
注:模式修饰符可以写在正则表达式内部,也可以写在外部
/tm/i(?i)tm(?-i)(?i:tm)
PCRE兼容正则表达式函数
preg_grep()函数
语法:
array preg_grep( string pattern,array input)
返回input数组中与pattern相匹配的元素
<?php$preg = '/\d{3,4}-?\d{7,8}/';//国内电话格式表达式,开头是三位或四位,然后固定字符,最后跟七到八位数字$arr = array('54188','54199','54189');$preg_arr = preg_grep($preg,$arr);var_dump($preg_arr);//查看新数组的结构print_r($preg_arr);?>
preg_match()和preg_match_all()函数
语法:
int preg_match/preg_match_all(string pattern,string subject[,array matches])
返回在subject中匹配pattern的次数,
如果有数组matches,每次匹配的结果将储存在这个数组中
<?php$str = 'This is an example!';$preg = '/\b\w{2}\b/';$num1 = preg_match($preg,$str,$str1);echo $num1.'<br>';var_dump($str1);$num2 = preg_match_all($preg,$str,$str2);echo '<p>'.$num2.'<br>';var_dump($str2);?>
preg_quote()函数
语法:
string preg_quote( string str[,string delimiter])
将字符串str中所有特殊字符进行自动转义(是指正则表达式中有一定意义的元字符,其他如“@”“#”等不会被当作特殊字符处理)
如果有参数delimiter,该参数所包含的字串也将被转义
函数返回转义后的字串(在特殊字符前加上“\”)
<?php$str = '!、$、^、*、+、.、[、]、\\、/、b、<、>';$str2 = 'b';$match_one = preg_quote($str,$str2);echo $match_one;?>
preg_replace()函数
语法:
mixed preg_replace(mixed pattren,mixed replacement,mixed subject[,int limit])
在字符串subject中匹配pattern,
将其替换成字串replacement
如果有limit,则替换limit次
<?php$string = '[b]粗体字[/b]';$b_rst = preg_replace('/\[b\](.*)\[\/b\]/i','<b>$1</b>',$string);//其中\对特殊字符的转义,.*匹配任意字符串,<b>文本的标签,/i忽略大小写echo $b_rst;?>
preg_replace_callback()函数
语法:
mixed preg_replace_callback(mixed pattern,callback callback,mixed subject[,int limit])
用于查找和替换字符串
<?phpfunction c_back($str){$str = "<font color=$str[1]>$str[2]</font>";return $str;}$string = '[color=blue]字体颜色[/color]';echo preg_replace_callback('/\[color=(.*)\](.*)\[\/color\]/U',"c_back",$string);?>
preg_split()函数
语法:
array preg_split(string pattern,string subject[,int limit])
使用表达式pattern来分割字符串subject
如果有limit,表示数组中最多有limit个元素
注:用法与ereg_split()函数相同
应用正则表达式对用户注册信息进行验证
验证邮箱的正则表达式:
/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;//\w是任意字符的意思,+是至少出现一次的意思,[-+.']\w包含方括号里的字符和任意字符的组合,-中画线,+下划线
