为了账号安全,请及时绑定邮箱和手机立即绑定

求大神解释下为什么输出是这样的?

$p = '/\d+?\-\d+?/';

$str = "我的电话是010-12345678";

preg_match($p, $str, $match);

echo $match[0];  //结果为:010-1


正在回答

2 回答

不好意思。重新回复一下。

这个例子中`\d+?` 是比较容易范迷糊的。后面的那组`\d+?`你已经知道原因了。 我说一下前面的那组`\d+?`

当正则开始匹配的时候,`\d+?`会最先匹配`我`,发现不对,继续匹配,直到匹配到字符串中的第一个0,发现对了。但这时候重点来了,如果0后面匹配到杠(-)以后,才满足`\d+?\-` 这一段。但是0后面不是-,而是1.所以会重新匹配01,然后依然是上面那样。直到匹配到010-的时候发现满足`\d+?\-` ,那么它会继续匹配剩下的正则表达式部分。后面的你也知道了。


这里关键点是那个杠(-)因为你只有匹配到杠(-)的时候才满足`\d+?\-`这段,即匹配结果是010-  

0 回复 有任何疑惑可以回复我~
#1

搞不懂丶 提问者

非常感谢!
2015-04-30 回复 有任何疑惑可以回复我~
#2

搞不懂丶 提问者

谢谢啦
2015-04-30 回复 有任何疑惑可以回复我~

第二个\d 匹配到了1就结束了。因为那个+表示1个或者多个。既然匹配到1了,就表示正则满足,自然就结束后面的匹配了

0 回复 有任何疑惑可以回复我~
#1

搞不懂丶 提问者

谢谢同学的回答,你说的这个我晓得,但是为什么前面的\d+?输出的是010,而不是0呢?
2015-04-29 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
PHP进阶篇
  • 参与学习       181943    人
  • 解答问题       2668    个

轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序

进入课程

求大神解释下为什么输出是这样的?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号