Ищем функции с токенайзером PHP - PullRequest
3 голосов
/ 29 января 2012

Прямо сейчас у меня есть скрипт, который использует токенизатор PHP для поиска определенных функций в файле исходного кода PHP.Шаблон, который я сейчас ищу:

T_STRING + T_WHITESPACE (необязательно) + "("

. Похоже, это пока соответствует всем моим тестам, кроме переменных функций, которые я игнорируюдля целей этого вопроса.

Очевидная проблема здесь состоит в том, что этот шаблон производит много ложных срабатываний, например, соответствия определений функций:

public function foo() {  // foo() should not be matched

Мой вопрос таков: есть более надежный / точный метод для просмотра исходного кода и удаления всех вызовов функций? Может быть, лучший способ, чем вообще использовать токенизатор?

Редактировать:

В частности, я пытаюсь эмулировать функциональность disable_functions PHP-директивы в файле класса . Поэтому, если exec() следует запретить, я пытаюсь найти любойиспользование этой функции в анализируемом файле. Я понимаю, что переменные функции делают это ужасно трудным, поэтому я их обнаруживаю и запрещаю.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2015

Вместо того, чтобы использовать токенизатор, рассмотрите возможность использования анализатора более высокого уровня для анализа вашего кода.Например, PHP-Parser может явно идентифицировать объявления функций, а также вызовы переменных функций.

0 голосов
/ 29 января 2012

Сначала вы запускаете токенизатор (доступен на PHP).Затем вы запускаете парсер поверх токенов.Парсер должен прочитать токены и уметь сообщать вам, для чего был использован конкретный токен.Насколько надежен результат, зависит от надежности вашего парсера.

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

...