PHP文件中的Preg_match类名

时间:2010-05-03 04:58:07

标签: php preg-match

我有一个脚本递归扫描一个目录,从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 {”。

4 个答案:

答案 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插件中找到它。唯一的问题是它似乎有时会挂起。不确定这是一个错误还是只是很慢。