Сопоставить класс PHP с регулярным выражением - PullRequest
0 голосов
/ 04 августа 2010

Я хочу поймать классы Php из файла:

class a {
   function test() { }
}

class b extends a {
   function test() { }
}

, и результат должен быть равен

class a {
   function test() { }
}

и

class b extends a {
   function test() { }
}

Ответы [ 5 ]

5 голосов
/ 04 августа 2010

регулярные выражения плохо разбирают грамматику языков программирования. Вместо этого рассмотрим функции токенизатора. например http://php.net/manual/en/function.token-get-all.php см. также http://framework.zend.com/apidoc/core/Zend_Reflection/Zend_Reflection_File.html

1 голос
/ 04 августа 2010

Одно регулярное выражение не сделает этого. PHP - более сложный язык, чем регулярные выражения (вставьте что-нибудь о контекстно-свободной и регулярной грамматике здесь). Это сведет вас с ума, даже если вы попробуете, если вы не измените свой исходный код, чтобы облегчить сопоставление с регулярным выражением.

0 голосов
/ 04 августа 2010

Используйте token_get_all, чтобы получить массив языковых токенов кода PHP. Затем выполните его итерацию и найдите токен со значением T_CLASS , представляющим ключевое слово class (это не учитывает абстрактные классы или видимость). Следующий токен T_STRING является именем класса. Затем найдите следующий простой токен со значением {, увеличьте счетчик глубины блока и уменьшайте его с каждым простым } токеном до тех пор, пока не будет достигнуто то же количество закрывающих скобок, что и у открывающих скобок (тогда ваш счетчик равен 0). Затем вы прошли всю декларацию класса.

0 голосов
/ 04 августа 2010

Вот что вы должны использовать:

http://www.php.net/manual/en/function.token-get-all.php

0 голосов
/ 04 августа 2010

На данный момент работает следующее регулярное выражение:

^(?:(public|protected|private|abstract)\s+)?class\s+([a-z0-9_]+)(?:\s+extends\s+([a-z0-9_]+))?(?:\s+implements\s+([a-z0-9_]+))?.+?{.+?^}

Потребность:

case insensitive | ^$ match at line breaks | dot matches new lines

Это работает, только если у «class» и последнего «}» нет отступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...