php получить содержимое функции - возможно ли регулярное выражение?

У меня есть регулярное выражение для поиска всех определений функций. Теперь я хочу получить также содержимое функций, например, как третье поле в $matches это возможно с помощью регулярных выражений, или мне нужен какой-то push-pop машина из-за вложенности {} скобки? То, что я хочу сделать, это скрипт, который анализирует PHP-код и выясняет, какие функции имеют зависимости. Если сценарий уже есть, дайте мне знать!

$content = file_get_contents($fileName);
preg_match_all("/(function )(\w+\(.*?\))/", $content, $matches);

Я не хочу использовать php-tokenizer, потому что он вычисляет также некоторые "скрытые функции", такие как предопределенные функции и тому подобное, но мне нужны только функции, написанные в коде.

1 ответ

Решение

Даже если вы не хуже Ноама Хомского, вы должны понимать это:

PHP не является регулярным языком, поэтому не может быть выражен или проанализирован с помощью регулярных выражений.

Чтобы быть обычным языком, язык должен, помимо прочего, быть свободным от контекста.

языковые иерархии

"Без контекста" означает, что "слово" в языке означает одно и то же, независимо от того, где оно встречается. Это не относится к PHP. Фактически, даже ваш простой фрагмент для поиска сигнатур функций уже вылетает и горит здесь:

// function foo()

Контекст комментария аннулирует это function Ключевое слово его обычного значения. Не говоря уже о:

'function foo()';
<<<HERE
    function foo()
HERE;

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

Используйте парсер.

Другие вопросы по тегам