加括号和不加括号的匹配结果为什么会不一样

来源:3-5 使用正则表达式进行匹配

慕雪5353966

2016-02-05 11:53

$pattern='/([\w\-]+@[\w]+\.\w+)/';  //加括号和不加括号的匹配结果为什么会不一样

preg_match($pattern,$subject,$str);

print_r($str);

输出为:

array

(

[0] => spark@imooc.com

[1] => spark@imooc.com

)

写回答 关注

2回答

  • weibo_牛板筋与可乐_0
    2016-02-06 10:42:24
    已采纳
    1. (子组的开始标记

      )子组的结束标记

    2. 子组通过圆括号分隔界定,并且它们可以嵌套。 将一个模式中的一部分标记为子组(子模式)主要是来做两件事情:

      (1) 将可选分支局部化。比如,模式cat(arcat|erpillar|)匹配 ”cat”, “cataract”, “caterpillar” 中的一个,如果没有圆括号的话,它匹配的则是 ”cataract”, “erpillar” 以及空字符串。

      (2) 将子组设定为捕获子组(向上面定义的). 当整个模式匹配后, 目标字符串中匹配子组的部分将会通过 pcre_exec()()的 ovector 参数回传给调用者。 左括号从左至右出现的次序就是对应子组的下标(从 1 开始), 可以通过这些下标数字来获取捕获子模式匹配结果。

    3. 比如,如果字符串 ”the red king” 使用模式((red|white) (king|queen)) 进行匹配, 模式匹配到的结果是 array(“red king”, ”red king”, “red”, “king”) 的形式, 其中第 0 个元素是整个模式匹配的结果,后面的三个元素依次为三个子组匹配的结果。 它们的下表分别为 1, 2, 3。

    3. 也就是说,如果你不加圆括号,则只进行一次匹配,也就是整体匹配。

    输出应该为:

    array

    (

    [0] => spark@imooc.com

    )

    如果你加了圆括号,则第一次匹配为整体匹配,第二次匹配为该子组的匹配。

    所以输出应该为:

    array

    (

    [0] => spark@imooc.com

    [1] => spark@imooc.com

    )


  • 慕雪5353966
    2016-02-12 21:07:27

    谢谢您的解答

PHP进阶篇

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

181728 学习 · 2575 问题

查看课程

相似问题