Подсчет подшаблонов в PHP PCRE RegEx - PullRequest
1 голос
/ 01 сентября 2011

Я хочу реализовать что-то вроде «редактора для регулярных выражений». Это для опытных пользователей моего приложения PHP. Проблема в том, что мне нужно что-то вроде «отражения» для регулярного выражения (точнее, для любого заданного регулярного выражения), чтобы выяснить, сколько подшаблонов оно содержит. В Python я просто набираю:

re.compile(regex).groups

Как реализовать это в PHP? Было бы также неплохо иметь возможность безопасно знать, может ли выражение даже скомпилироваться. В Python есть исключения, и их легко обработать. PHP запускает мое приложение без каких-либо предупреждений или выдает несколько предупреждений / ошибок, которые невозможно отследить.

Спасибо за любые предложения!

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Нет никакого самоанализа для регулярных выражений preg - у pcre есть функция для этого (pcre_fullinfo), но по какой-то причине разработчики php не удосужились предоставить для этого клей. Вы можете подать запрос на добавление функции на bugs.php.net.

Единственный способ проверить правильность регулярного выражения - это скомпилировать его в блоке try-catch, см. Как проверить, является ли строка допустимым PCRE? для примера.

Тем не менее, я не думаю, что это хорошая идея - разрешать пользователям выполнять произвольные регулярные выражения на вашем сервере. Злонамеренное или просто неправильно написанное выражение может довольно быстро съесть всю память.

1 голос
/ 01 сентября 2011

Я вижу, что это очень тяжело.Максимальное количество возможных шаблонов довольно сложно определить, потому что расширенные регулярные выражения / POSIX / Perl так сложны.Они гнездятся, захватывая некоторые шаблоны, значит, других не будет, и так далее.Я не знаю, как определить максимальное количество шаблонов непосредственно в PHP, и отработать его самостоятельно в основном будет равносильно повторной реализации всего движка, и это очень сложно;Я сомневаюсь, что большинство из нас использует половину этого.

Вторая половина вопроса - это обман .

...