Имя класса Preg_match из файла PHP - PullRequest
2 голосов
/ 03 мая 2010

У меня есть скрипт, который рекурсивно сканирует каталог, извлекая имена классов из файлов php и сохраняя имена этих классов в массиве. Это прекрасно работает даже через довольно большие папки библиотеки Zend Framework.

Проблема в том, что классы, расширяющие другие классы, не включаются в массив.

Вот мой текущий preg_match:

if (preg_match("/class\s*(\w*)\s*\{/i",strip_comments(file_get_contents($file)),$matches)) $classes[] = $matches[1];

Я знаю, что последнее \ s * не правильно; там должно быть что-то, что может поймать "{" или "extends Some_Other_Class {".

Ответы [ 4 ]

3 голосов
/ 03 мая 2010

Попробуйте:

/^class ([a-zA-Z0-9_]+)/
2 голосов
/ 02 мая 2012
'/class[\s\n]+([a-zA-Z0-9_]+)[\s\na-zA-Z0-9_]+\{/'

Этот работает лучше, потому что поддерживает классы, которые расширяют или реализуют.

Пример:

class blah implements base 
{

будет соответствовать.

0 голосов
/ 09 мая 2010

В итоге я использовал этот php-файл foreach в пути включения:

$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, который делает нечто подобное. Единственная загвоздка в том, что иногда кажется, что она зависает. Не уверен, что это ошибка или она медленная.

0 голосов
/ 03 мая 2010

Ваш шаблон должен просто брать первое слово после ключевого слова class, чтобы быть именем класса, в отличие от вашего текущего шаблона, который ищет одно слово между ключевым словом class и открывающей скобкой {. Это проблематично, когда ваш класс расширяет другой, потому что между разделителями нет ни одного слова и, следовательно, шаблон не будет совпадать.

Вот шаблон для проверки:

/^\s*class\s+([a-zA-Z0-9_]+)/
...