正则表达式
处理字符串时,有很多较为复杂的字符串用普通的字符串处理函数无法干净的完成。比如说,可能需要验证一个Email地址是否合法,为此需要查看许多不容易检查的规则。这正是正则表达式的用武之地。正则表达式是功能强大而简明的字符组,其中可以包含大量的逻辑,特别值得一提的是正则表达式相当简短。
一.正则表达式语法(Perl风格)
Perl一直被认为是最伟大的解析语言之一,它提供了一种全面的正则表达式,即使是最复杂的字符串模式,也可以用这种正则表达式语言搜索和替换。PHP开发人员认识到,与其重新发明正则表达式,不如让PHP用户直接使用声名赫赫的Perl正则表达式语言,即Perl风格的函数。
匹配函数:所谓匹配,就是按照一定的规则一个一个的比较过去,preg_match()函数在字符串中搜索模式,如果存在则返回true,否则返回false。
模式规则: 所谓模式,就是规则,按照这个规则去判断是否匹配。/php/ 在字符串前后加上两条斜杠即可。
<?php
preg_match('/php/','php1');
?>
然而这样的模式还不能满足实际需要,那就需要使用更规范的正则表达式。正则表达式,就是一种能刻画某种词法规则的字符串。例如:0[Xx]([0-9a-zA-Z_])+ 就是一个正则表达式,[Xx]表示字符“X”或“x”任选其一;0-9表示范围0-9;a-z表示范围;()表示一个整体;+表示重复次数至少一次。因此,这个正则表达式的含义就是:以0作开头,后接X或x,再后面接上若干个(至少一个)数字、字母、下划线。如果原字符串是”0Xdkbfkbf_”,那就是匹配的。
二.正则表达式中的元素
正则表达式中包含三种元素分别为:元字符(特殊含义的字符)、量词(重复次数)、修饰符。
量词
语法 | 描述 |
+ | 匹配任何至少包含一个前导字符串 |
* | 匹配任何包含零个或多个前导字符串 |
? | 匹配任何包含零个或一个前导字符串 |
. | 匹配任意字符串 |
{x} | 匹配任何包含x个前导字符串 |
{x,y} | 匹配任何包含x到y个前导字符串 |
{x,} | 匹配任何包含至少x个前导字符串 |
$ | 匹配字符串的行尾 |
^ | 匹配字符串的行首 |
() | 包围一个字符分组或定义个反引用,可以使用\1\2提取 |
所谓前导符,就是指在量词前面的一个字符或一个字符串整体,例如
/asp+/ 前导符是p
/0[\w]+/ 前导符是[\w],即一个数字,字母或者下划线
/ \w ([a-z][0-9])+/ 前导符是([a-z][0-9]),即由一个字母和一个数字组成的整体。
举例:
1. /[a-zA-Z]*/ 匹配任何包含零个或多个字母
2. /[.]?/ 匹配零个或1个任意字符
3. /[a-zA-Z]{5}/ 匹配5个字母
4. /[a-zA-Z]{5,}/ 匹配至少5个字母
5. /[a-zA-Z]{5,9}/ 匹配5到9个字母
6. /^[a-z]+/ 从行首开始匹配至少一个字母,例如 “avhchjv”就是匹配的,而 “0cvhvs”就是不匹 配的。
7. /[a-z]+$/ 匹配字符串的行尾,即字符串要以至少一个字母结尾,例如 “avhchjv”就是匹配的, 而 “cvhvs0”就是不匹配的。
8. /^[a-z]+$/ 行首和行尾都要匹配,例如 “feudvud”就是匹配的,而“3bfidbfk”和
“fvyyuvds8“,”3uibfib8“ 都是不匹配的。
9. /(\w\d){1,2}/ 这里()就表示分组,意思是把里面的字符看成一个整体,里面的字符都要出现, 这个 正则表达式意思就是匹配一至两个1位字母和1位数字的组合。如”v6”就是 匹配 的,”d”和”7832”都不匹配。
元字符
语法 | 描述 |
[a-z] | 匹配任何包含小写字母a-z的字符串 |
[A-Z] | 匹配任何包含大写字母A-Z的字符串 |
[0-9] | 匹配任何包含数字0-9的字符串 |
[abc] | 匹配任何包含小写字母a、b、c的字符串 |
[^abc] | 匹配任何不包含小写字母a、b、c的字符串 |
[a-zA-Z0-9_] | 匹配任何包含a-zA-Z0-9和下划线的字符串 |
\w | 匹配任何包含a-zA-Z0-9和下划线的字符串(同上) |
\W | 匹配任何没有下划线和字母数字的字符串 |
\d | 匹配任何数字字符,和[0-9]相同 |
\D | 匹配任何非数字字符,和[^0-9]相同 |
\s | 匹配任何空白字符 |
\S | 匹配任何非空白字符 |
\ | 匹配正则中的特殊字符 |
举例:
1. if(preg_match("/[0-9]/", "54344")) echo 1; else echo 0;
2. if(preg_match("/([\s\w])+/", " this_we")) echo 1; else echo 0;
3. $mode = '/ph\+p/'; //规则模式
$string = 'ph+p'; //字符串
if (preg_match($mode,$string)) echo 1; else echo 0;
4. 匹配特殊字符,特殊字符就是正则里出现了的特殊字符,比如 $ ^ . \ () * + [] ? {}等等
if(preg_match("/^[\$]$/", "\$")) echo 1; else echo 0; //匹配 $要用\$
if(preg_match("/^[\\\\]$/", "\\")) echo 1; else echo 0; //匹配反斜杠要用 \\\\
修饰符
语法 | 描述 |
i | 完成不区分大小写的搜索 |
x | 忽略正则中的空白 |
A | 强制从头开始匹配 |
举例:
1. $mode="/php/i";
if(preg_match($mode, "PHP")) echo 1; else echo 0;
2. $mode="/php /x"; //x表示忽略规则中的空白
if(preg_match($mode, "php")) echo 1; else echo 0;
3. <?php
$mode = '/php/A'; //规则模式
$string = 'phpsdfsdfphp'; //字符串
if (preg_match($mode,$string)) echo 1; else echo 0;
?>
三、常用的正则表达式
匹配中文字符的正则表达式: /[\u4e00-\u9fa5]/
匹配Email地址的正则表达式:/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
中文、英文、数字及下划线:/^[\u4e00-\u9fa5_a-zA-Z0-9]+$/
腾讯QQ号:/[1-9][0-9]{4,}/ 腾讯qq号从10000开始