PHP中的正则表达式

1,251 阅读3分钟

前言

最近在看基础相关的东西,发现以前能够写出来的正则表达式,现在写不出来了,比如千分位格式化输出金额,用正则表达式写不出来,也只能用php提供number_format函数来解决问题。索性把这块的知识复习一下,从头开始了解,我又怕忘得太快,于是乎记在这里

梳理正则表达式的知识点

其实学习正则表达式记住几个知识点,然后就是刷题,比如匹配手机号、身份证号、邮箱等等,通过这些案例来学习正则表达式是最好的方法,记得太多的知识点反而写不出来。废话不多说,先了解下知识点

元字符

下面列出来了一些常用的元字符,具体的元字符的用法这里不在列出,了解就可以了,可以结合别人写的正则表达式回头来学习,这样记住的要更深刻一些

限定符

限定符要结合元字符一起使用,才能有出奇制胜的功效,具体在文章后买列举出常用的案例,看下它们是如何使用的

多选结构

多选机构在一些特定的场合下使用的比较多,比如匹配域名后缀(com|cn|hk|sg)

分组和引用

如果要重复一个字符呢,用小括号可以制造这么一个字符串。如果要想使用前面匹配到的结果可以使用分组

贪婪和非贪婪

在使用重复的量词(+,*,{m,n})会尽可能多的匹配字符,如果我们不想要贪婪模式,子希望在匹配成功的前提下使用更少的重复字符,可以使用非贪婪模式

在匹配一些东西的时候,懒惰模式非常的有用,比如匹配标签img中的src属性值,就使用到了懒惰模式,规则就是这样/<img[\s\S]*?src="([\s\S]+?)"[\s\S]*?>/

模式匹配优先级

元字符在匹配的时候,是有优先级的,同级优先级从左至右,其他情况如下面所示,优先级递减

环视

这是正则表达式比较难理解的地方,这里我想记录着,用另外一篇文章来讲解一下,我要恶补一下知识,才能弄明白

特殊情况

在正则表达式中如果要匹配$是比较特殊的,它们两个都是元字符,在使用时必须转义所以匹配$使用的规则为\\\$

在PHP中正则表达式必须放在单双号引号中,不能像JS那样单独出现,而\在单引号中是转义字符,所以必须把规则中的\再次转义,得到\\\\\\$,也就是所匹配$需要使用6个\和一个$

在双引号中$有特殊的含义,需要对其转义后才能使用,得到\\\\\\\$

总结一下,正则表达式和引号中的特殊字符都得转义,为了避免特殊字符需要转义,强烈建议使用单引号

案例

  • 匹配整数 /^-?\d+$/
  • 匹配正整数 /^[1-9]\d*$/
  • 匹配两位小数 /^\d+\.\d{2}$/
  • 匹配11位的手机号 /^1\d{10}$/
  • 匹配身份证号 /^(?:\d{15}|\d{17}[\dxX])$/
  • 匹配邮箱账号 /^[\w\-]+@(?:\w+\.)+\w+$/
  • 匹配IP地址 /^((25[0-5]|2[0-4]\d|[1-9]\d{0,2})\.){3}(25[0-5]|2[0-4]\d|[1-9]\d{0,2})$/
  • 匹配URL /^(?:https?:\/\/)?(?:[\w-]+\.)+[a-zA-Z]+$/
  • 匹配img标签src属性值 /<img[^>]+?src="([^"]+)"/
  • 匹配js标签src属性值 /<img[^>]+?src="([^"]+)"/
  • 匹配中文 /[\u4e00-\u9fa5]+/u

总结

正则表达式的学习要结合案例,单纯的学习正则规则是没有用的,通过几个案例来学习,怎么使用,遇到的问题,这样的学习要高效很多,而且非常的实用

下面的文章我将学习正则表达式中的环视,一起期待

参考资料

learnku.com/articles/29…

www.cnblogs.com/tsql/p/5860…

www.zjmainstay.cn/my-regexp

deerchao.cn/tutorials/r…