捕获所有方法参数默认值


Capturing all method arguments default values

我正在研究逆向工程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, Template $T='variable '''value', ''BlaBla''Bla $Bla = " blablabla ''" bleble "      [$match] => 数组        (            [0] => 数组                (                    [0] => 对等$M =                    [1] => 模板 $T='变量 '''值'                    [2] => ''BlaBla''Bla $Bla = " blablabla ''" bleble "                )            [类型] => 数组                (                    [0] => 对等                    [1] => 模板                    [2] => ''BlaBla''Bla                )            [1] => 数组                (                    [0] => 对等                    [1] => 模板                    [2] => ''BlaBla''Bla                )            [名称] => 数组                (                    [0] => M                    [1] => T                    [2] => 布拉                )            [2] => 数组                (                    [0] => M                    [1] => T                    [2] => 布拉                )            [val] => 数组                (                    [0] =>                    [1] =>变量 '''value                    [2] => blablabla ''" bleble                )            [3] => 数组                (                    [0] =>                    [1] =>变量 '''value                    [2] => blablabla ''" bleble                )        ))

~ 提前感谢您的任何建议

如果您尝试解析单引号或双引号字符串,则应这样做
分两步。验证,然后分析值。

您可能可以使用'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
           [^''']*
           (?: '' . [^''']* )*
      )
      '
 )