You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式查找PHP文件中使用的类?

PHP正则匹配代码中使用的类名问题解决

问题根源

你遇到的问题核心是PHP字符串的转义规则:在PHP的正则表达式字符串中,反斜杠需要双重转义(即写\\\\才能表示正则里的单个\)。你原来的正则\w+(\\\w+)+(\(|:在PHP字符串中会被解析为\w+(\w+)+(\(|:,丢失了匹配命名空间分隔符的反斜杠,导致无法正确匹配带命名空间的类名。

修正后的正则表达式

结合你的需求(排除new实例化的类,匹配静态调用、::class引用的类),可以使用以下正则:

/(?<!new\s)(\w+(?:\\\\\w+)+)(?:::|\()/

正则各部分说明

  • (?<!new\s):负向零宽断言,确保匹配的类名前面不是new (排除你不需要的FooNamespace\ClassFoo)
  • (\w+(?:\\\\\w+)+):捕获目标类名,其中:
    • \w+:匹配类名/命名空间的起始标识符
    • (?:\\\\\w+)+:匹配多个带反斜杠的子命名空间或类名后缀,非捕获分组避免生成多余的捕获结果
  • (?:::|\():正向零宽断言,确保类名后面跟着::(静态调用、::class)或((静态方法调用),保证是类的实际使用场景

PHP代码示例

$content = <<<'PHP'
<?php

namespace App\MyNamespace;

use App\MyNamespace\Foo as FooNamespace;

class MyClass
{
    public function run()
    {
        (new FooNamespace\ClassFoo());
        FooNamespace\ClassBar::class;
        FooNamespace\ClassBaz::boot();
        FooNamespace\SubNamespace\ClassBaz::boot();
    }
}
PHP;

// 执行匹配
preg_match_all('/(?<!new\s)(\w+(?:\\\\\w+)+)(?:::|\()/', $content, $matches);
// 去重并获取结果
$usedClasses = array_unique($matches[1]);

print_r($usedClasses);

输出结果

Array
(
    [0] => FooNamespace\ClassBar
    [1] => FooNamespace\ClassBaz
    [2] => FooNamespace\SubNamespace\ClassBaz
)

额外注意事项

  • 如果需要匹配更多类使用场景(比如类作为类型提示),可以扩展正则的断言部分
  • \w包含字母、数字和下划线,能覆盖大部分合法的PHP类名/命名空间标识符

内容的提问来源于stack exchange,提问作者train_fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:25:31