一开始我的确正则表达式头疼。不过去网上看了一些文章,其实正则并不是很难,因此记录下学习心得。

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地址中有三个部分:

  1. 用户名 (在 ‘@’ 左边的一切) :要求是含有大小写字母阿拉伯数字,句号(‘.’)减号(‘-‘)and下划线’_’)。

2.’@’

  1. 服务器名(就是剩下那部分) :要求和用户名的规则差不多,唯独不能允许下划线的存在。

现在,用户名的开始和结束都不能是句点,服务器也是这样。还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:

^[_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了

Nginx 自动禁止爬虫IP采集

### 背景最近我们有一个公开服务提供给客户查询关键词的热度值,由于这个API做在官方网站上,自然没有用户登陆,也没有很高查询成本,所以设计上没有任何鉴权无法进行身份认定,于是就被一个爬虫开了超高并发请求,直接后端的AWS Tomcat CPU被用尽,导致无法响应。爬虫显然...… Continue reading

Redis原子性事务Lua应用

Published on June 28, 2020