我有一个脚本递归扫描一个目录,从php文件中提取类名,并将这些类名存储在一个数组中。即使通过相当大的Zend Framework库文件夹,这也能很好地工作。
问题是扩展其他类的类没有包含在数组中。
这是我目前的preg_match:
if (preg_match("/class\s*(\w*)\s*\{/i",strip_comments(file_get_contents($file)),$matches)) $classes[] = $matches[1];
我知道最后的\ s *不对;应该有一些东西可以捕获“{”或“扩展Some_Other_Class {”。
答案 0 :(得分:3)
尝试:
/^class ([a-zA-Z0-9_]+)/
答案 1 :(得分:2)
'/class[\s\n]+([a-zA-Z0-9_]+)[\s\na-zA-Z0-9_]+\{/'
这个更好用,因为它支持扩展或实现的类。
示例:
class blah implements base
{
将匹配。
答案 2 :(得分:0)
您的模式应该只是将class
关键字后面的第一个单词作为类名而不是当前模式,该模式在class
关键字和左大括号{{1}之间查找单个单词}}。这是有问题的,因为你的类扩展了另一个,因为分隔符之间不只有一个单词,因此模式不匹配。
这是一个尝试的模式:
{
答案 3 :(得分:0)
我最终在include路径中使用了这个foreach php文件:
$handle = @fopen($path.'/'.$dir, "r");
$stop=false;
if ($handle)
{
while (!$stop&&!feof($handle))
{
$line = fgets($handle, 4096);
$matches=array();
if (preg_match('#^(\s*)((?:(?:abstract|final|static)\s+)*)class\s+'.$input.'([-a-zA-Z0-9_]+)(?:\s+extends\s+([-a-zA-Z0-9_]+))?(?:\s+implements\s+([-a-zA-Z0-9_,\s]+))?#',$line,$matches))
{
$stop=true;
$classes[]=$matches[3];
}
}
fclose($handle);
}
似乎工作得很好。在另一个类似的Coda插件中找到它。唯一的问题是它似乎有时会挂起。不确定这是一个错误还是只是很慢。