一开始我的确正则表达式头疼。不过去网上看了一些文章,其实正则并不是很难,因此记录下学习心得。
1、符号 ^ 和 $ 分别用来匹配字符串的开始和结束:
“^page” | 开头一定要有 page 字符串 | page=2; page=3&action=list;… |
“=add$” | 结尾一定要有 =add 的字符串 | action=add; age=18&do=add;… |
“^index$ | 以abc开头和以abc结尾的字符串 | index(实际上只有这个结果) |
“read” | 匹配包含read的字符 | action=read&export;… |
2、大括号{n,m},其中n<m,当m存在时候:
{n,m},匹配前面字符出现的次数为n-m次
当m不存在时:
{n,}匹配前面字符出现次数大于等于n次
{n}匹配前面字符出现等于n次
“you{2}” | o后面一定要跟2个u(一个也不能少) | youu |
“you{2,}” | o后面至少要跟2个u | youu;youuu;… |
“you{2,4}” | o后面至少要跟2-4个u | youu;youuu;youuuu; |
3、符号 * 匹配前面字符出现0次或者多次;相当于{0,}
符号 + 匹配前面字符出现1次或者多次;{1,}
符号 ? 匹配前面字符出现0次或者1次;{0,1}
要点:’*’ ‘+’ 和 ‘?’ 只管它前面那个字符。
“you*” | o后面一定要跟0个或者多个u | yo;you;youu;… |
“you+” | o后面至少要跟1个或者多个u | you;youu;youuu;… |
“you?” | o后面至少要跟0个或者1个u | yo;you |
“yo+u?” | 至少1个以上o后跟着0个或者1个u | you;yoou;yo;yooo;… |
4、’ | ’相当于OR操作,小括号’()’表示集合: |
“hi|hello” | 匹配含有”hi” 或者 “hello” 的 字符串; |
“(hi|h)me” | 匹配含有”hime” 或者 “hme” 的 字符串; |
“(hi|h)?me” | 匹配含有”hi” 或者 “h”这样0个或多个,并且后面跟着me 的 字符串; |
5、一个点(‘.’)可以代表所有的单一字符,不包括”\n”,如果要匹配”\n”,用’[\n.]’这种模式。
“t.{1,2}p” | t后面加上1-2个任意字符加上p; | tip;toop;tucp; … |
“^.{3}$” | 三个任意字符; | 123;asf;… |
6、中括号’[]’:中括号括住的内容只匹配一个单一的字符 。当^用在中括号开头的时候,就表示排除括号里的字符。
“[ab]” | 匹配单个的 a 或者 b ( 和 “a│b” 一样); |
“[a-d]” | : 匹配’a’ 到’d’的单个字符 (和”a│b│c│d” 还有 “[abcd]”效果一样); |
“^[a-zA-Z]” | 匹配以大小写字母开头的字符串; |
“[0-9]%” | 匹配含有 形如 x% 的字符串; |
“,[a-zA-Z0-9]$” | 匹配以逗号再加一个数字或字母结尾的字符串; |
“%[^a-zA-Z]%” | 匹配含有两个百分号里面有一个非字母的字符串 |
注:一般我们都用[a-zA-Z]来指定字符为一个大小写英文
7、为了PHP能够解释,一些特殊字符必须在这些字符面前后加”,并且将一些字符转义。
不要忘记在中括号里面的字符是这条规路的例外—在中括号里面,所有的特殊字符,包括(”),都将失去他们的特殊性质 “[*+?{}.]”匹配含有这些字符的字符串:
还有,正如regx的手册告诉我们:”如果列表里含有’]’,最好把它作为列表里的第一个字符(可能跟在’^’后面)。如果含有’-‘,最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-‘将有效。
看了上面的例子,你对{n,m}应该理解了吧。要注意的是,n和m都不能为负整数,而且n总是小于m。这样,才能 最少匹配n次且最多匹配m次。如”p{1,5}”将匹配 “pvpppppp”中的前五个p
看一个具体的例子: 构造检查email的正则表达式
在一个完整的email地址中有三个部分:
- 用户名 (在 ‘@’ 左边的一切) :要求是含有大小写字母阿拉伯数字,句号(‘.’)减号(‘-‘)and下划线’_’)。
2.’@’
- 服务器名(就是剩下那部分) :要求和用户名的规则差不多,唯独不能允许下划线的存在。
现在,用户名的开始和结束都不能是句点,服务器也是这样。还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$
现在还不能允许句号的存在。我们把它加上:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$
上面的意思就是说:以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串。
后面的服务器名字也是一样,但要去掉下划线:
^[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*$
好。现在只需要用”@”把两部分连接:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用:
preg(“^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$”,$eamil)
就可以得到是否为email了