系统学习PHP之正则表达式

正则表达式是一个从左到右匹配目标字符串的模式。它不是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..

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180309G0RU7800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券