设为首页 收藏本站
查看: 545|回复: 0

[经验分享] 【PHP正值表达式教程】

[复制链接]

尚未签到

发表于 2017-3-28 14:27:47 | 显示全部楼层 |阅读模式
正则表达式简介
  在某些应用中,往往有时候需要根据一定的规则来匹配(查找)确认一些字符串,如要求用户输入的 QQ 号码为数字且至少 5 位。用于描述这些规则的工具就是正则表达式。


最简单的匹配
  最简单的匹配就是直接给定字符匹配。如用字符 a 去匹配 aabab ,则会匹配出 3 个结果,分别是字符串中的第 1,2 和第 4 个字符。这种匹配是最简单的情况,但往往实际处理中会复杂得多,如下面的 “QQ号码为数字且至少5位” ,其对应的正则表达式为:


^\d{5,}$

  该正则表达式就描述需要确定的内容为至少 5 位以上的数字。我们来具体看看该表达式是怎么描述这一规则的:


  • ^:表示匹配字符串的开始,也即该字符串是独立的开始而不是包含在某个字符串之内
  • \d:表示匹配数字
  • {5,}:表示至少匹配5位及以上
  • $:表示匹配字符串的结束,也即该字符串是独立的结束
  现在就很清楚了,该正则表达式综合起来就是匹配 5 位以上的连续数字,且有独立的开始和结束,对于少于 5 位的数字,或者不是以数字开始和结尾的如 a123456b 这样都是无效的。

  从该例子可以看出,正则表达式是从左至右描述的。
  同样,如果要匹配移动号码的正则表达式为:

^1\d{10}$

提示
  由于对正则表达式的匹配结果,在很多情况下都不是那么确定,所以最好下载一些辅助工具用于测试正则表达式的匹配结果。这类工具如 Match Tracer、RegExBuilder 等,以及其他类似的工具也可。


元字符
  在上面的例子中,^ 、\d 及 $ 等这些符号,代表了特定的匹配意义,我们称之为元字符,常用的元字符如下:


元字符
说明


.
匹配除换行符意外的任意字符


\w
匹配字母或数字或下划线


\s
匹配任意的空白符


\d
匹配数字


\b
匹配单词的开始或结束


^
匹配字符串的开始


$
匹配字符串的结束


[x]
匹配x字符,如匹配字符串中的 a、b 和 c 字符


\W
\w的反义,即匹配任意非字母,数字,下划线和汉字的字符


\S
\s的反义,即匹配任意非空白符的字符


\D
\d的反义,即匹配任意非数字的字符


\B
\b的反义,即不是单词开头或结束的位置


[^x]
匹配除了 x 意外的任意字符,如 [^abc] 匹配除了 abc 这几个字母之外的任意字符

提示


  • 当我们要匹配这些元字符的时候,我们需要用到字符转义功能,同样正则表达式里面用 \ 来表示转义,如要匹配 . 符号,则需要用 \. ,否则 . 会被解释成“除换行符外的任意字符”。当然,要匹配 \ ,则需要写成 \\
  • 连续的数字或字母可以用 – 符号连接起来,如 匹配所有的小写字母,[1-5] 匹配 1 至 5 这 5 个数字

重复
  正则表达式的威力在于其能够在模式中包含选择和循环,正则表达式用一些重复规则来表达循环匹配。
  常用的重复如下:
  



重复
说明


*
重复零次或更多次


+
重复 1 次或更多次


?
重复零次或 1 次


{n}
重复 n 次


{n,}
重复 n 次或更多次


{n,m}
重复 n 到 m 次

分枝
  分枝是指制定几个规则,如果满足任意一种规则,则都当作匹配成功。具体来说就是用 | 符号把各种规则分开,且条件从左至右匹配。

提示
  由于分枝规定,只要匹配成功,就不再对后面的条件加以匹配,所以如果你想匹配有包含关系的内容,请注意规则的顺序。
  下面是一个使用分枝的例子。
  美国的邮政编码的规则是 5 个数字或者 5 个数字连上 4 个数字,如 12345 或者 54321-1234 ,如果要匹配所有的邮编,则正确的正则表达式为:


\d{5}-\d{4}|\d{5}
//错误写法
\d{5}|\d{5}-\d{4}

  下面的错误写法,只能匹配到 5 位数字及 9 位数字的前 5 位数字的情况,而不能匹配 9 位数字的邮编。

分组
  在正则表达式中,可以用小括号将一些规则括起来当作分组,分组可以作为一个元字符来看待。
  分组的例子,验证 IP 地址:

(\d{1,3}\.){3}\d{1,3}

  这是一个简单的且不完善的匹配 IP 地址的正则表达式,因为它除了能匹配正确的 IP 地址外,还能匹配如 322.197.578.888 这种不存在的 IP 地址。

  当然,用这个表达式简单匹配成功后可以在利用 PHP 的算术比较再加以判断 IP 地址是否正确。而正则表达式中没有提供算术比较功能,如果要完全匹配正确的 IP 地址,则需要改进如下:


((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)

规则说明
  该规则关键之处在于确定 IP 地址每一段范围为 0-255 ,然后再重复 4 次即可。在:

25[0-5]|2[0-4]\d|[01]?\d\d?

  中,用分枝首先确定了 250-255 和 200-249 。 [01]?\d\d? 则确定了 0-199 的范围,综合起来就是 0-255 。

贪婪与懒惰
  正则表达式默认的情况下,会在满足匹配条件下尽可能的匹配更多内容。如 a.*b,用他来匹配 aabab ,它会匹配整个 aabab ,而不会只匹配到 aab 为止,这就是贪婪匹配。

  与贪婪匹配对应的是,在满足匹配条件的情况下尽可能的匹配更少的内容,这就是懒惰匹配。
  上述例子对应的懒惰匹配规则为:

a.*?b

  如果用该表达式去匹配 aabab ,那么就会得到 aab 和 ab 这样两个匹配结果。
  常用的懒惰限定符如下:
  



懒惰限定符
说明


*?
重复任意次,但尽可能少重复


+?
重复 1 次或更多次,但尽可能少重复


??
重复 0 次或 1 次,但尽可能少重复


{n,}
重复 n 次以上,但尽可能少重复


{n,m}
重复 n 到 m 次,但尽可能少重复

模式修正符
  模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明。
  常用的模式修正符如下:
  



模式修正符
说明


i
模式中的字符将同时匹配大小写字母


m
字符串视为多行


s
将字符串视为单行,换行符作为普通字符


x
将模式中的空白忽略


e
preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。


A
强制仅从目标字符串的开头开始匹配


D
模式中的 $ 元字符仅匹配目标字符串的结尾


U
匹配最近的字符串


u
模式字符串被当成 UTF-8

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356616-1-1.html 上篇帖子: PHP添加中文水印 下篇帖子: PHP万能小偷程序源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表