php - preg_match的理解
伊谢尔伦
伊谢尔伦 2017-04-11 10:14:00
[PHP讨论组]

无法理解后半段话

举例:

$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显示完整匹配,然后还会显示每个捕获的内容,大致是这样

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(5)
黄舟

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

PHP中文网

有图有真相


以下是老答案:

/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',
  ),
)
大家讲道理

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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