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

php中文网
发布: 2016-09-19 09:16:24
原创
1384人浏览过

如题:

<code class="php">echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om'));//return 0
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.cccccom'));//return 1
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccc5com'));//return false
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccccom'));//return 1</code>
登录后复制

回复内容:

如题:

<code class="php">echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om'));//return 0
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.cccccom'));//return 1
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccc5com'));//return false
echo var_dump(preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lon.lon.lon.loh4va.cccccom'));//return 1</code>
登录后复制

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

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

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

立即学习PHP免费学习笔记(深入)”;

原:

<code>preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om');</code>
登录后复制

改:

<code>preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om'); </code>
登录后复制

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

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

<code>preg_match('/^(([a-zA-Z0-9]+\-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+$/i','lo-n.l-on.loh-4va.ccccc5om')</code>
登录后复制

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

共花费74781步, 7万多步!
改成我上面修改后的

<code>preg_match('/^(?:(?:\w+\.?\w+)-?){4}$/', 'lo-n.l-on.loh-4va.ccccc5om');</code>
登录后复制

后:

会译·对照式翻译
会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

会译·对照式翻译 0
查看详情 会译·对照式翻译

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

只需要34步。

分析一下匹配过程.
题主的:

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

修改后的匹配步骤:

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

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

----补充于dec 29 ---
关于正则的学习:
我是在learning perl里详细研究过。个人觉得用好正则主要需要遵循下面几点:
1 分清什么时候用贪婪匹配、非贪婪匹配
2 尽量用锚位符
3 能分组的尽量分组
4 元字符与其枚举不如反向过滤和概括,如,[a-zA-Z0-9]+不如w+,某些特定场景里,w+不如1+,如果再加上锚位符(b锚单词,?= ?>, ?!正反向预搜索), 那就更快了. 所谓量词嵌套,就是不该用贪婪匹配(+*的时候就尽量少用,这样能极大程度上减少backtrack,也就是回溯次数。
更感性的认识,我要找出10亿个排成一排里的人里男性,你直接告诉我最明显的一个过几个特征就行了,比如那两棵相距100万平方公里里的一排都是男性,没必要告诉我100个特征让我一个一个去核对。

以上。


  1. -s ↩

http://php.net/manual/zh/func...

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号