Я хочу поймать классы Php из файла:
class a { function test() { } } class b extends a { function test() { } }
, и результат должен быть равен
class a { function test() { } }
и
class b extends a { function test() { } }
регулярные выражения плохо разбирают грамматику языков программирования. Вместо этого рассмотрим функции токенизатора. например http://php.net/manual/en/function.token-get-all.php см. также http://framework.zend.com/apidoc/core/Zend_Reflection/Zend_Reflection_File.html
Одно регулярное выражение не сделает этого. PHP - более сложный язык, чем регулярные выражения (вставьте что-нибудь о контекстно-свободной и регулярной грамматике здесь). Это сведет вас с ума, даже если вы попробуете, если вы не измените свой исходный код, чтобы облегчить сопоставление с регулярным выражением.
Используйте token_get_all, чтобы получить массив языковых токенов кода PHP. Затем выполните его итерацию и найдите токен со значением T_CLASS , представляющим ключевое слово class (это не учитывает абстрактные классы или видимость). Следующий токен T_STRING является именем класса. Затем найдите следующий простой токен со значением {, увеличьте счетчик глубины блока и уменьшайте его с каждым простым } токеном до тех пор, пока не будет достигнуто то же количество закрывающих скобок, что и у открывающих скобок (тогда ваш счетчик равен 0). Затем вы прошли всю декларацию класса.
token_get_all
class
{
}
Вот что вы должны использовать:
http://www.php.net/manual/en/function.token-get-all.php
На данный момент работает следующее регулярное выражение:
^(?:(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» и последнего «}» нет отступа.