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

来源:3-4 贪婪模式与懒惰模式

搞不懂丶

2015-04-28 13:06

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

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

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

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


写回答 关注

2回答

  • 樂猪
    2015-04-30 14:00:31
    已采纳

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

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

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


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

    搞不懂丶

    谢谢啦

    2015-04-30 16:53:45

    共 2 条回复 >

  • 樂猪
    2015-04-29 13:03:44

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

    搞不懂丶

    谢谢同学的回答,你说的这个我晓得,但是为什么前面的\d+?输出的是010,而不是0呢?

    2015-04-29 16:51:45

    共 2 条回复 >

PHP进阶篇

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

181897 学习 · 2595 问题

查看课程

相似问题