php форматер для var_export () и улучшения - PullRequest
4 голосов
/ 19 октября 2019

У меня есть этот скрипт:

https://wtools.io/php-sandbox/boyq

Основной код ссылки:

<?php
#Class Initialization
class Example {
    function foo_function() {
        return "Hello World! Object";
    }
}
$var_object = new Example;
#Store Class in and Array
$Test       = array('level1' => array('level2' => $var_object));
#function get my Type of value correctly:
function myGetType($var) {
    if (is_null($var) OR $var == 'null' OR $var == 'NULL') {
        return "(Type of NULL)";
    }

    if (is_array($var)) {
        return "(array)";
    }

    if (in_array($var, array("true", "false"), true)) {
        return "boolean";
    }

    if ((int) $var == $var && is_numeric($var)) {
        return "integer" . '(' . strlen($var) . ')';
    }

    if ((float) $var == $var && is_numeric($var)) {
        return "float" . '(' . strlen($var) . ')';
    }

    if (is_object($var)) {
        return "object";
    }

    if (strpos($var, 'resource') !== false AND strpos($var, 'of type ') !== false) {
        return "resource";
    }

    if (is_string($var)) {
        return "string" . '(' . strlen($var) . ')';
    }

    return "unknown";
}
#function to know if Exist a resource in the text:
function CheckResourceType($Var) {
    foreach ($Var as $k => $v) {
        if (is_array($v)) {
            $wrappedArray[$k] = CheckResourceType($v);
        } else {
            if (is_resource($v)) {
                ob_start();
                var_dump($v);
                $v = ob_get_clean();
                $v = preg_replace('~\R~', '', $v);
            }
            $wrappedArray[$k] = $v;
        }
    }
    return $wrappedArray;
}

#Main function to Format:
function VarExportFormat($Var) {
    $textvar = '';
    if (!is_array($Var)) {
        $textvar       = var_export($Var, true);
        $textvar       = preg_replace('~^ +~m', '$0$0', $textvar);
        $typeval       = myGetType($Var);
        $textvarArr[0] = $typeval . ' ' . var_export($Var, true);
    } else {
        //Check Point A Start
        $Var     = CheckResourceType($Var);
        $textvar = var_export($Var, true);
        $textvar = preg_replace('~^ +~m', '$0$0', $textvar);
        $textvar = preg_split("~\R~", $textvar);
        $textvar = preg_replace_callback(
            "~ => \K\V+(?=,)~",
            function ($m) {
                return myGetType(str_replace("'", "", $m[0])) . ": {$m[0]}";
            }, $textvar
        );
        $textvarArr = preg_replace(["/\s*array\s\($/", "/\)(,)?$/", "/\s=>\s$/"], [NULL, ']$1', ' => array ['], $textvar);
        //Check Point A END
    }
    if (!isset($textvarArr[1])) {
        $textvar = PHP_EOL . $textvarArr[0];
    } else {
        $textvar = join(PHP_EOL, array_filter(["array ["] + $textvarArr));
    }
    if (substr($textvar, -1) == '[') {
        $textvar = str_replace("[", "[]", $textvar);
    }
    //Check Point B Start

    $textvar = preg_replace('/(.*\(\K\V+\s+\)],)/', 'object)[]' . PHP_EOL . '],', $textvar);

    //Check Point B END
    $textvar = highlight_string("<?php \n#Output of Variable:\n" . $textvar . ";\n?>", true);
    return $textvar;
}

#Call to Format function.
echo VarExportFormat($Test);

и я ищу регулярное выражение, чтобы отфильтровать форматvar_export() и другие данные, полученные от пользователя stackoverflow.

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

Ниже приведены регулярные выражения, используемые для фильтрации и форматирования каждой строки массива:

Секция A

//Check Point A Start
$Var     = CheckResourceType($Var);
$textvar = var_export($Var, true);
$textvar = preg_replace('~^ +~m', '$0$0', $textvar);
$textvar = preg_split("~\R~", $textvar);
$textvar = preg_replace_callback(
    "~ => \K\V+(?=,)~",
    function ($m) {
        return myGetType(str_replace("'", "", $m[0])) . ": {$m[0]}";
    }, $textvar
);
$textvarArr = preg_replace(["/\s*array\s\($/", "/\)(,)?$/", "/\s=>\s$/"], [NULL, ']$1', ' => array ['], $textvar);
//Check Point A END

Секция B

//Check Point B Start

$textvar = preg_replace('/(.*\(\K\V+\s+\)],)/', 'object)[]' . PHP_EOL . '],', $textvar);

//Check Point B END

Одно из этих регулярных выражений отвечает за добавление 4 пробелов или табуляций, но только за строки, начинающиеся с одинарных кавычек.

Я обнаружил некоторые несоответствия, в случае, если значение является объектом или классами или функциями, вывод выглядит так:

<?php 
#Output of Variable:
array [
    'level1' => array [
        'level2' => array [
        Example::__set_state(object)[]
],
    ],
];
?>

, который должен выглядеть следующим образом:

<?php
#Output of Variable:
array [
    'level1' => array [
        'level2' => array [
            Example::__set_state(object)[]
        ],
    ],
];
?>

Я думаю, что с регулярными выражениями должно быть что-то не так, то есть я не могу это определить, мне нужно добавить больше места для Example::__set_state(object)[] и добавить пробелы в следующей строке.

...