Учитывая фиктивную функцию как таковую:
public function handle()
{
if (isset($input['data']) {
switch($data) {
...
}
} else {
switch($data) {
...
}
}
}
Я намерен получить содержимое этой функции, проблема заключается в сопоставлении вложенных шаблонов фигурных скобок {...}
.
Я сталкивался с рекурсивными шаблонами, но не мог понять регулярное выражение, которое будет соответствовать телу функции.
Я пробовал следующее (без рекурсии):
$pattern = "/function\shandle\([a-zA-Z0-9_\$\s,]+\)?". // match "function handle(...)"
'[\n\s]?[\t\s]*'. // regardless of the indentation preceding the {
'{([^{}]*)}/'; // find everything within braces.
preg_match($pattern, $contents, $match);
Эта схема вообще не подходит. Я уверен, что это последний бит, который неверен '{([^{}]*)}/'
, поскольку этот шаблон работает, когда в теле нет других фигурных скобок.
Заменив его на:
'{([^}]*)}/';
Он соответствовал до закрытия }
переключателя внутри оператора if
и останавливался на этом (включая }
переключателя, но исключая if
).
Как и этот шаблон, тот же результат:
'{(\K[^}]*(?=)})/m';
{
или}
(без соответствующей начальной или конечной скобки), тогда ваш рекурсивный шаблон не будет работать. И это только первая ситуация, о которой я подумал. - person Magnus Eriksson   schedule 30.06.2016{{{{}}}}
, сломается при{{{{{}}}}}
вложенности 5. - person TemporalWolf   schedule 30.06.2016pushdown automaton
, которое регулярное выражение не может сделать. Он может подделать его для достаточно простых задач, но в конечном итоге регулярное выражение будет бесконечно длинным, чтобы охватить все случаи. - person TemporalWolf   schedule 30.06.2016pushdown automaton
и о том, как он может решить такую проблему, никогда раньше не слышал об этом термине (обязательно проведу некоторое исследование, но также буду признателен за ваши биты по этому поводу). - person mulkave   schedule 30.06.2016