正则表达式匹配PHP中的命名空间

0 php regex

今天我的目标是检索
与其命名空间名称相关联的所有PHP类名称,但我遇到了困难.这是我的一个例子:

$content =<<<END
<?php

namespace test;

class a { }

class b { }

namespace foo;

class bar { }
?>
END;

preg_match_all('~^\s*((?:namespace)\s+(\w+);)?\s*(?:abstract\s+|final\s+)?(?:class|interface)\s+(\w+)~mi', $content, $classes);
var_dump($classes);
Run Code Online (Sandbox Code Playgroud)

该表达式只有在命名空间中最多只有一个类时才有效,但我无法弄清楚如何根据命名空间使其匹配所有类.

mag*_*tik 5

您可以尝试以下模式:

((?:\\{1,2}\w+|\w+\\{1,2})(?:\w+\\{0,2})+)

出于某种原因,我不得不同时匹配Namespace\ClassNamespace\\Class.但是你必须更换 {1,2},并{0,2}分别进行任何操作,?

在线测试:https://regex101.com/r/fE2kU9/3

  • 实际上不太正确,因为这仍然会通过,但它是一个无效的命名空间:`\Ending\Slash\\`。您需要将 `\w+` 添加到最后一个组的末尾,以确保该组具有最终的命名空间类 - 请参阅这些测试 https://regex101.com/r/rQpdmc/3/tests (2认同)