php 正则 回溯,这段php正则表达式preg_match为什么有时候会return false?

看代码你只是过滤。int(0)代表没匹配到,int(1)是匹配成功。

帮你改一下代码吧,分组捕获不能乱用,正则书写要简洁,还要尽量提高运行效率,还不能存储无谓的变量。要搞懂正则引擎的回溯原理才能明白自己在干什么。

更初级一点的知识,你至少要了解贪婪匹配和非贪婪匹配匹配原理和运行效率的差异。

原:

preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om');

改:

preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om');

我以题主的问题来分析一下。

以题主的第一段代码为例:

preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om')

3e459f999bd6bb27d8ebcf63adacfcb5.png

共花费74781步, 7万多步!

改成我上面修改后的

preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om');

后:

4b324f55ae9252e531ff2e394bdf9431.png

只需要34步。

分析一下匹配过程.

题主的:

121742a2993b4cca4f5251751c41f98c.png

修改后的匹配步骤:

3983bbdea6586b87501f6af7ffdd9082.png

74781步 : 34 步 约等于2200%, 效率真的是天壤之别.

----补充于dec 29 ---

关于正则的学习:

我是在learning perl里详细研究过。个人觉得用好正则主要需要遵循下面几点:

1 分清什么时候用贪婪匹配、非贪婪匹配

2 尽量用锚位符

3 能分组的尽量分组

4 元字符与其枚举不如反向过滤和概括,如,[a-zA-Z0-9]+不如w+,某些特定场景里,w+不如

以上。

-s ↩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值