#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. Это захватило бы имя класса или было ли оно частным / общедоступным