preg_match的理解

无法理解后半段话

clipboard.png

举例:

$str="public function myFn (a, b){//...}";
preg_match('/function\s+([^\s(]*)/',$str,$m);
var_dump($m);
// 输出
array(2) {
  [0]=>
  string(13) "function myFn"
  [1]=>
  string(4) "myFn"
}

对着文档,看着例子,还是无法理解,myFn是怎么出来的。正则本身就是来找function xxx这样的字符串的,为什么就把myFn找出来了?

总结:一直以为()是函数后面的(),这里的()是正则里面的捕获符号,preg_match显示完整匹配,然后还会显示每个捕获的内容,大致是这样

阅读 3.4k
5 个回答

这是正则语法的捕获组的概念,建议可以看一下正则的语法中关于捕获组的概念,这个在PHP和JS中都是一样的,这是正则的特性

有图有真相
有图有真相


以下是老答案:

/function\s+([^\s(]*)/
\s = 空白,对应上边的空格
[^\s] = [^空白] = 不是空白
+ 一次或多次匹配
* 任意次匹配(包含0次)
表达式的[( /function\s+([^\s(]*)/ )]匹配项:"function myFn"  

[([^\s(]*)]中的分组1对应的匹配项[不为空,不能是( ]:"myFn"

教你一个简单的理解,在正则中一律用 () 括号括起来的,都是匹配结果的输出,你的正则中,function是直接写在正则中的,所以$matches[1]中不会出现function,而$matches[0]是正则匹配结果的全部文本

不想匹配出函数名,把正则表达式里的圆括号()去掉就好,()表示子模式(也叫子组).

if(preg_match_all(
    '%function\s+([^\s(]*)%', 
    'function foo() {} function bar() {}', 
    $arr)) 
var_export($arr);
输出:
array (
  0 => 
  array (
    0 => 'function foo',
    1 => 'function bar',
  ),
  1 => 
  array (
    0 => 'foo',
    1 => 'bar',
  ),
)

if(preg_match_all(
    '%function\s+[^\s(]*%', 
    'function foo() {} function bar() {}', 
    $arr)) 
var_export($arr);
输出:
array (
  0 => 
  array (
    0 => 'function foo',
    1 => 'function bar',
  ),
)

正则匹配的时候会去找小括号,一个小括号为一组,数组顺序是小括号从左到右出现的顺序。
(.?(.?))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题