Захват всех параметров метода по умолчанию

Я работаю над методами обратного инжиниринга PHP, потому что предоставленный механизм \ ReflectionClass недостаточен для моего текущего проекта.

В настоящее время я хочу использовать прототипы метода регулярных выражений. Я застрял при получении значений аргументов по умолчанию. Я предоставляю статический метод MethodArgs :: createFromString () с содержимым скобок прототипа метода. Его цель — получить все аргументы из строки, включая тип аргумента, имя … и значение по умолчанию, и создать собственный экземпляр. До сих пор я был в состоянии успешно извлечь значения по умолчанию для одинарных и двойных кавычек строки, включая исключительные случаи, такие как ‘\’ ‘или «\» «. Но диапазон скалярных значений, которые PHP принимает для значения аргумента по умолчанию, немного больше У меня проблемы с расширением моего регулярного выражения для соответствия также типам, таким как логические, целые числа, числа с плавающей запятой или массивы.

<?php
class MethodArgs
{
static public function createFromString($str) {
$str = "   Peer \$M = null, Template \$T='variable \'value', \BlaBla\Bla \$Bla = \" blablabla \\\" bleble \"   ";

//$pat = '#(?:(?:\'|")(?<val>(?:[^\'"]|(?<=\\\)(?:\'|"))*)(?:\'|"))+#i';
//$pat = '#(?:(?<type>[^\$\s,\(\)]+)\s)?\$(?<name>[^,.\s\)=]+)(?:\s*=\s*)?(?:\'(?<val>(?:[^\']|(?<=\\\)\')*)\')?#i';
$pat = '#(?:(?<type>[^\$\s,\(\)]+)\s)?\$(?<name>[^,.\s\)=]+)(?:\s*=\s*)?(?:(?:\'|")(?<val>(?:[^\'"]|(?<=\\\)(?:\'|"))*)(?:\'|"))?#i';

$a = preg_match_all($pat, $str, $match);
var_dump(array('$a' => $a, '$pat' => $pat, '$str' => $str, '$match' => $match));
die();

/*$Args = new static();
for($i=0; $i<count($match[0]); $i++) {
$Arg = new MethodArg();
$Arg->setType($match['type'][$i]);
$Arg->setName($match['name'][$i]);
$Arg->setDefaultValue($match['val'][$i]);
$Args[] = $Arg;
}

return $Args;*/
}
}

Выход ( Скриншот ):

массив
(
[$ a] => 3
[$ pat] => # (?: (? [^ \ $ \ s, \ (\)] +) \ s)? \ $ (? [^,. \ s \) =] +) (?: \ s * = \ s *)? (? :( ?: '| ") (? (?: [^'"] | (? Peer $ M = null, шаблон $ T = 'variable \' value ', \ BlaBla \ Bla $ Bla = "blablabla \" bleble "[$ match] => Массив
(
[0] => Массив
(
[0] => Пир $ M =
[1] => Шаблон $ T = 'variable \' value '
[2] => \ BlaBla \ Bla $ Bla = "blablabla \" bleble ")

[type] => Array
(
[0] => Пэр
[1] => Шаблон
[2] => \ BlaBla \ Bla
)

[1] => Массив
(
[0] => Пэр
[1] => Шаблон
[2] => \ BlaBla \ Bla
)

[name] => Массив
(
[0] => M
[1] => T
[2] => Бла
)

[2] => Массив
(
[0] => M
[1] => T
[2] => Бла
)

[val] => Массив
(
[0] =>
[1] => значение переменной \ '
[2] => блаблабла \ "блебл
)

[3] => Массив
(
[0] =>
[1] => значение переменной \ '
[2] => блаблабла \ "блебл
)

)

)

~ Заранее спасибо за любой совет

-4

Решение

Если вы пытаетесь разобрать одинарные или двойные кавычки, это должно быть сделано
в два этапа. Проверка, а затем анализ значений.

Вы могли бы, вероятно, сделать оба в одном регулярном выражении с использованием \G якорь,
проверка с помощью \A\G и разбор только с \G,

Если вы уверены, что он действителен, вы можете пропустить проверку.
Ниже приведены две части (могут быть объединены при необходимости).
Обратите внимание, что он анализирует одинарные или двойные кавычки, используя метод развернутого цикла,
что довольно быстро

Проверка:

 # Validation:  '~^(?s)[^"\']*(?:"[^"\\\]*(?:\\\.[^"\\\]*)*"|\'[^\'\\\]*(?:\\\.[^\'\\\]*)*\'|[^"\'])*$~'

^
(?s)
[^"']*
(?:
"[^"\\]*
(?: \\ . [^"\\]* )*
"|
'
[^'\\]*
(?: \\ . [^'\\]* )*
'
|
[^"']
)*
$

Синтаксический:

 # Parsing:  '~(?s)(?|"([^"\\\]*(?:\\\.[^"\\\]*)*)"|\'([^\'\\\]*(?:\\\.[^\'\\\]*)*)\')~'

(?s)                          # Dot all modifier
(?|                           # Branch Reset
"(                             # (1), double quoted string data
[^"\\]*
(?: \\ . [^"\\]* )*
)
"|                              # OR
'
(                             # (1), single quoted string data
[^'\\]*
(?: \\ . [^'\\]* )*
)
'
)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]