如何用正则表达式查找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
相关产品推荐
相关产品推荐

