PHP-функция регулярных выражений

#php #regex #tokenize

#php #регулярное выражение #маркировать

Вопрос:

Да, я знаю, что людям не нравится разбирать PHP, используйте токенизатор, который они сказали, это будет здорово, они сказали… Я хочу, чтобы вы знали, что это не здорово, это даже не хорошо.

Я работаю в .NET и использую PCRE-NET и хочу проанализировать некоторые функции PHP, чтобы посмотреть, смогу ли я немного потрясти дерево PHP.

Я попытался использовать CodeParser which uses Antlr4 для токенизации, результаты, которые я получил, были ужасны для навигации. Да, технически все это есть, но оно настолько запутано, что на самом деле регулярное выражение лучше подходит для того, что я ищу.

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

 (?<functionScope>w )s*functions (?<functionName>w )s*((?<functionArguments>(?:[^()] )*)?s*)[s:]*.*(?<functionBody>{(?:[^{}] |(?-1))* })
  

Попробуйте: https://regex101.com/r/yU6K45/1

Это разобьет PHP-файл на отдельные области, функции, аргументы и тело функции. Сейчас я смотрю на functionBody и хочу найти все функции, используемые внутри этой функции, которые у меня есть здесь:

 (?=[^=s])((?<functionClass>[$?w[wd]*)?(?<ClassOperator>::|->|\)?){0,3}?(?<functionName>w[wd]*)((?<Arguments>.*)?)
  

Смотрите это по адресу: https://regex101.com/r/3JzPR5/1

Проблема, с которой я сталкиваюсь, связана с именованными группами. При большом пространстве имен именованные группы не работают хорошо. Мне интересно, есть ли у вас какие-либо идеи, как разделить строку:

   $uri = ExtraLevelPsr7UriResolver::resolve(Psr7Utils::uriFor($config['base_uri']), $uri);
  

Туда, где у меня было бы что-то вроде:

 Full match               ExtraLevelPsr7UriResolver::resolve(Psr7Utils::uriFor($config['base_uri']), $uri)
Group `functionClass`    ExtraLevel
Group `functionClass2`   Psr7
Group `functionClass3`   UriResolver::
Group `functionName`     resolve
Group `Arguments`        Psr7Utils::uriFor($config['base_uri']), $uri
  

Хотелось бы сопоставить таким образом, чтобы это не нарушалось, когда нет 3-4 уровней.

Комментарии:

1. Сам PHP имеет встроенный токенизатор . Возможно, вы можете написать простой PHP-скрипт, который извлекает необходимую вам информацию в формат, подходящий для использования .NET (JSON или любой другой).

2. Я ставлю под сомнение этот синтаксис: [$?w[wd]* пожалуйста, выразите свое намерение.

3. Это захватило бы имя класса или было ли оно частным / общедоступным