正则表达式是一个从左到右匹配目标字符串的模式。它不是PHP的专属,如何一门成熟的语言都支持正则,可以说正则就是一门编程语言。这里就只研究 PHP 正则的使用,先来介绍几个PHP中使用正则的函数
PCRE函数
#1 preg_match / preg_match_all
int preg_match / preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
参数 1 :$pattern匹配模式;
参数 2 :$subject匹配源;
参数 3 :$matches存储匹配结果;
返回值:preg_match在第一次匹配后 将会停止搜索,所以它的值将是 0 次(不匹配)或 1次preg_match_all() 会一直搜索subject 直到到达结尾。
#2 preg_replace /preg_filter
mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
在 subject 寻找与 pattern 匹配的的值并替换成 replacement,返回是替换之后的结果。 pattern 和 replacement 可以作为数组进行替换,preg_filter()等价于preg_replace(),但在处理数组替换时返回结果有所差异,preg_replace不管匹配不匹配,数组的值都进行返回,preg_filter 返回匹配的替换之后的数组preg_grep
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回给定数组 input 中与模式pattern 匹配的元素组成的数组,(阉割版的preg_filter,),只匹配,不替换。
#3 preg_split
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
升级版的explode函数,在 subject 寻找与 pattern 匹配的的值将其作为分割点,每一段为数组的值。
#4 preg_quote
string preg_quote ( string $str [, string $delimiter = NULL ] )
转义正则表达式字符;
模式语法
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。
#1 原子概念
原子是正则表达式中最小的单位,分为可见原子与不可见原子,可见原子是指Unicode编码中用键盘输出后肉眼可见的字符。
关于可见原子需要注意:
1、匹配文字时,需要将文字转换为对应的Unicode编码格式,否则会因编码格式导致未知错误;
2、\. \* \+ \? \,所有有意义的字符,如果想作为原子使用,必须统统使用 \ 转义字符转义;
不可见原子就是Unicode编码中用键盘输出后肉眼不可见的字符,例如:(\n)换行符、(\r)回车、(\t)制表符、空格等。好,下面开始正式介绍正在表达模式的语法
#2 分隔符
当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以使任意非字母数字、非反斜线、非空白字符。
经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~);
如果分隔符需要在模式内进行匹配,它必须使用反斜线进行转义。如果分隔符经常在 模式内出现, 一个更好的选择就是是用其他分隔符来提高可读性。
#1 来一些界定符的栗子:
/http:\/\//#http://#
#3 元字符
正则表达式的威力源于它可以在模式中拥有选择和重复的能力。 一些字符被赋予 特殊的涵义,使其不再单纯的代表自己,模式中的这种有特殊涵义的编码字符 称为 元字符。#1 元字符的作用之 |、[]、[^] 定义原子的筛选方式:
| 匹配两个或多个分支选择 如: Duang|duang, 匹配Duang或者duang, 注意Duang和duang必须是连续的;
[] 匹配方括号中任意一个原子如: [D,d]uang, 意思是匹配Duang或者duang,[34^9]匹配3,4,^,9这4个原子,[0-9a-zA-Z]匹字母和数字,[3-6]匹配3到6之间的数字
[^] 匹配除了方括号中的原子 如[^0-9a-zA-Z]匹配除了字母和数字的原子, 其中尖号必须紧靠左中括号
#2 元字符的作用之定义原子的集合
. 匹配除了换行符之外的任意字符, 和[^\n]等价
\d 匹配任意一个十进制数字 即[0-9]
\D 匹配任意一个非十进制数字 即[^0-9]
\w 匹配任意一个数字, 字母或下划线 [0-9a-zA-Z_]
\W匹配人一个非数字, 字母或下划线[^0-9a-zA-Z_]
\s 匹配一个不可见的原子 即[\f\n\r\t\v]
\S匹配一个可见的原子 即[^\f\n\r\t\v]
#4 量词
重复次数是通过量词指定的,可以紧跟在下面元素之后:
边界控制及模式单元
^:匹配字符串开始的位置,如/^Dang/,规定第一个字符必须是D;
$:匹配字符串结尾的位置,如 /duang$/规定g是最后一个字符 ;
():匹配其中的整体为一个原子,如 /(du|D)ang/ 能匹配到duang;
#5 修正模式
先介绍贪婪模式和懒惰模式匹配,正则表达式中默认是贪婪模式匹配的, 即匹配结果存在歧义的时候取长的,如下
$pattern = '/123.+5/';$subject = '123456654321';$t1 = preg_match_all($pattern, $subject,$matches);var_dump($matches); #12345665
在模式末尾条件U标识符修改为懒惰模式,匹配结果存在歧义的时候取短的:
$pattern = '/123.+5/U';$subject = '123456654321';$t1 = preg_match_all($pattern, $subject,$matches);var_dump($matches); #12345
常见的修正模式总结有:
U/u 懒惰模式/贪婪模式
i 忽略英文字母的大小写
x 忽略空白 包括制表符和空格
s 将元字符 . 匹配包括换行符在内的所有字符
常用模式
网上分享非常有非常丰富的常用正则表达式的匹配模式,整理如下:
1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9](/.[a-zA-Z0-9][-a-zA-Z0-9])+/.?
3 InternetURL:[a-zA-z]+://[^\s]*
4 手机号码:^(13[0-9]|14[5|7]|15[0-9])\d$
5 电话号码 ^(\(\d-)|\d-)?\d$
6 国内电话号码(0511-4405222、021-87888822):\d-\d|\d-\d
7 身份证号(15位、18位数字):^\d|\d$
8 短身份证号码(数字、字母x结尾):^([0-9])(x|X)?$ 或 ^\d|[0-9x]|[0-9X]?$
9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w$
11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).$
12 日期格式:^\d-\d-\d
13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
15 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
16 首尾空白字符的正则表达式:^\s*|\s*$
17腾讯QQ号:[1-9][0-9] (腾讯QQ号从10000开始)
18 中国邮政编码:[1-9]\d(?!\d) (中国邮政编码为6位数字)
19 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
正则中还有部分高级特性没有记录,如有需要推荐书籍:《精通正则表达式》进行研究;
Bye..
领取专属 10元无门槛券
私享最新 技术干货