什么是正则表达式

一种描述字符串结构的语法规则,
一种特定的格式化模式
可以匹配、替换、截取匹配的字符串

正则表达式语法规则

一个完整的正则表达式由元字符和文本字符两部分构成
元字符是具有特定含义的字符,
如:“*”和“?”
文本字符就是普通的文本
如:字母和数字

行定位符

“^”和“$”
描述字串的边界
^为行的开始
$为行的结尾

  1. ^tm

匹配以tm开头的字串

  1. tm$

匹配以tm结尾的字串

  1. tm

匹配以tm开头或以tm结尾的字串

单词分界符

“\b”
使用单词分界符“\b”查找内容为tm的字串

  1. \btm\b

\B是匹配内容中有tm的单词

  1. \Btm\B

字符类

“[]”
正则表达式区别大小写,可以用“[]”忽略大小写
把匹配的字符放在[]中

  1. [Tt][Mm]

选择字符

“|”
也可以实现忽略大小写
使用“|”
该字符也可以理解成或

  1. (T|t)(M|m)

连字符

“-”
连字符解决了变量的命名只能以字母和下画线开头的问题

  1. [a,b,c,d...A,B,C,D...]
  2. [a-zA-Z]//与上式等同

排除字符

“[^]”
匹配不符合命名规则的变量
将行开始的符号放在括号里表示排除的意思
匹配不以字母和下画线开头的变量名

  1. [^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结尾

  1. ^s.t$

匹配以s开头,第三个字符为s,最后一个字符为t

  1. ^s.s.t$

转义字符

“\”
例如:匹配一个IP地址127.0.0.1

  1. [0-9]{1,3}(\.[0-9]{1,3}){3}

反斜线

将一些不可打印的字符显示

字符 说明
\a 警报,即ASCII中的字符(0x07)
\b 退格,即ASCII中的字符(0x08),在PHP中需要在“[ ]”中使用
\e Escape,即ASCII中的字符(0x1B)
\f 换页符,即ASCII中的字符(0x0C)
\n 换行符,即ASCII中的字符(0x0A)
\r 回车符,即ASCII中的字符(0x0D)
\t 水平制表符,即ASCII中的字符(0x09)
\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 当前匹配的起始位置

括号字符

“()”
改变限定符的作用范围

  1. (six|four)th//匹配sixth或fourth
  2. six|fourth//匹配six和fourth

分组

  1. (\.[0-9]{1,3}){3}//对分组(\.[0-9]{1,3})进行三次操作

反向引用

匹配连续出现的字符或字母

  1. it)\1
  2. ([a-z])([A-Z])\1\2

自己指定分组名称
格式:
(?P…)
反向引用分组
(?P=subname)

  1. (?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:…) 忽略空白字符

注:模式修饰符可以写在正则表达式内部,也可以写在外部

  1. /tm/i
  2. (?i)tm(?-i)
  3. (?i:tm)

PCRE兼容正则表达式函数

PCRE函数库执行效率略优于POSIX函数库

preg_grep()函数

语法:
array preg_grep( string pattern,array input)
返回input数组中与pattern相匹配的元素

  1. <?php
  2. $preg = '/\d{3,4}-?\d{7,8}/';//国内电话格式表达式,开头是三位或四位,然后固定字符,最后跟七到八位数字
  3. $arr = array('54188','54199','54189');
  4. $preg_arr = preg_grep($preg,$arr);
  5. var_dump($preg_arr);//查看新数组的结构
  6. print_r($preg_arr);
  7. ?>

preg_match()和preg_match_all()函数

语法:
int preg_match/preg_match_all(string pattern,string subject[,array matches])
返回在subject中匹配pattern的次数,
如果有数组matches,每次匹配的结果将储存在这个数组中

  1. <?php
  2. $str = 'This is an example!';
  3. $preg = '/\b\w{2}\b/';
  4. $num1 = preg_match($preg,$str,$str1);
  5. echo $num1.'<br>';
  6. var_dump($str1);
  7. $num2 = preg_match_all($preg,$str,$str2);
  8. echo '<p>'.$num2.'<br>';
  9. var_dump($str2);
  10. ?>

preg_quote()函数

语法:
string preg_quote( string str[,string delimiter])
将字符串str中所有特殊字符进行自动转义(是指正则表达式中有一定意义的元字符,其他如“@”“#”等不会被当作特殊字符处理)
如果有参数delimiter,该参数所包含的字串也将被转义
函数返回转义后的字串(在特殊字符前加上“\”)

  1. <?php
  2. $str = '!、$、^、*、+、.、[、]、\\、/、b、<、>';
  3. $str2 = 'b';
  4. $match_one = preg_quote($str,$str2);
  5. echo $match_one;
  6. ?>

结果中只有“\”和“/”前面没有加“\”,其他符号前面都有

preg_replace()函数

语法:
mixed preg_replace(mixed pattren,mixed replacement,mixed subject[,int limit])
在字符串subject中匹配pattern,
将其替换成字串replacement
如果有limit,则替换limit次

  1. <?php
  2. $string = '[b]粗体字[/b]';
  3. $b_rst = preg_replace('/\[b\](.*)\[\/b\]/i','<b>$1</b>',$string);//其中\对特殊字符的转义,.*匹配任意字符串,<b>文本的标签,/i忽略大小写
  4. echo $b_rst;
  5. ?>

preg_replace_callback()函数

语法:
mixed preg_replace_callback(mixed pattern,callback callback,mixed subject[,int limit])
用于查找和替换字符串

  1. <?php
  2. function c_back($str)
  3. {
  4. $str = "<font color=$str[1]>$str[2]</font>";
  5. return $str;
  6. }
  7. $string = '[color=blue]字体颜色[/color]';
  8. echo preg_replace_callback('/\[color=(.*)\](.*)\[\/color\]/U',"c_back",$string);
  9. ?>

preg_split()函数

语法:
array preg_split(string pattern,string subject[,int limit])
使用表达式pattern来分割字符串subject
如果有limit,表示数组中最多有limit个元素
注:用法与ereg_split()函数相同

应用正则表达式对用户注册信息进行验证

验证邮箱的正则表达式:

  1. /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;//\w是任意字符的意思,+是至少出现一次的意思,[-+.']\w包含方括号里的字符和任意字符的组合,-中画线,+下划线