【PHP基础知识】——PHP正则表达式

一、前言

正则表达式,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

二、概念与组成

一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串。一般的正则表达式都包含有以下三个结构:选择、数量限定、匹配

三、基本语法

正则表达式中包含三种元素:量词、元字符、修饰符
1、量词:①前导字符1个或多个:+;
②前导字符0或多个:* ;
③前导字符0或1个:? ;
④匹配任意一个字符:. ;
⑤匹配x个前导字符:{x} ;
⑥匹配x~y个前导字符:{x,y} ;
⑦匹配至少x个前导字符:{x,} ;
⑧匹配字符串行尾:$ ; 行首: ^ ;(^和$不能一起用,否则等于”=”号)
⑨字符串分组:();

2、元字符:[a-z],[0-9],[a-zA-Z0-9]等等(若[^abc],其中的^表示不包含),中括号表示匹配任意一个。

注:①\w等价于[a-zA-Z0-9_],\W等价于[^a-zA-Z0-9_];
②\d等价于[0-9],\D等价于[^0-9];
③\s表示匹配任意一个空格;
④匹配特殊字符(如+、*等):用\转义。

3、修饰符:在"/模式/"的外面:
① i:表示不区分大小写;
② m:表示多行识别(在匹配首尾时用);
③ x:忽略空白;
④ A:强制从头开始匹配(等价于^);
⑤ U:只匹配最近一个就结束,禁止贪婪匹配。

四、PHP正则表达式

由于正则表达式的广泛支持度和可用性强等特定,很多编程语言都实现了对正则表达式的支持,PHP也不例外,以下便是PHP正则表达式的常用方法总结

1、常用的正则表达式php语法组成
①pattern变量,即匹配模式;
②subject变量,即待匹配的字符串变量;
③matches变量,处理匹配结果后作为参数变量输出;

④flags变量,当该值为PREG_OFFSET_CAPTURE时,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的);该值为PREG_PATTERN_ORDER时,结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。
⑤offset变量,偏移量,标明从哪个位置开始匹配。

2、常用的正则匹配函数
①preg_match()
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
返回:pattern的匹配次数。它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索

②preg_match_all()
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
返回:返回完整匹配次数(可能是0),或者如果发生错误返回FALSE。

③preg_grep()
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回:返回使用input中key做索引的数组。

④preg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
功能:搜索subject中匹配pattern的部分,以replacement进行替换。
$limit:每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)。
$count:如果指定,将会被填充为完成的替换次数。
如果subject是一个数组,preg_replace()返回一个数组,其他情况下返回一个字符串。
如果匹配被查找到,替换后的subject被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回NULL。

五、常用的正则表达式

1、电子邮件正则表达式:\w+@\w+(?:\.(?:com|net|cn))?\.(?:com|net|cn) 
PHP中也可以使用:filter_var('<待筛选字符串>', FILTER_VALIDATE_EMAIL)来实现。

2、年-月-日的日期格式(可捕获闰年与平年):^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$
PHP中可用strtotime+date函数来进行格式化

3、电话号码(固话): ^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/

手机:/0?(13|14|15|18)[0-9]{9}


4、IP地址匹配:^(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)$

5、匹配URL:^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+


6、验证是否由数字、大写和小写字母组成的8-16位密码:^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$ 


六、正则表达式的优缺点

1、优点
正则表达式在处理复杂字符操作的时候,可以提高工作效率,也在一定程度节省你的代码量。
2、缺点
我们在使用正则表达式的时候,复杂的正则表达式会加大代码的复杂度,让人很难理解。所以我们有的时候需要在正则表达式内部添加注释,而且执行效率不高。
注:字符串处理函数的速度快于正则表达式。

猜你喜欢

转载自blog.csdn.net/dream_successor/article/details/78256922