I have this script Runing: Format var_export() PHP Script | WTOOLS
Main code of the link:
<?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);
and I search Regular Expression to filter the format of a var_export()
and other given from user of Stackoverflow.
The problem is that, I am not an expert in regular expressions and I minimally understand some, but the ones I am using are somewhat complex and that I have found in other scripts.
The following are regular expressions used to filter and format every string line of array:
Section 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
Section B
$textvar = preg_replace('/(.*\(\K\V+\s+\)],)/', 'object)[]' . PHP_EOL . '],', $textvar);
One of these regular expressions is responsible for adding 4 spaces or tabs, but only for the strings that start with single quotes.
I found some inconsistencies, in case the value is an object or classes or functions, the output look this:
<?php
#Output of Variable:
array [
'level1' => array [
'level2' => array [
Example::__set_state(object)[]
],
],
];
?>
which should be like this:
<?php
#Output of Variable:
array [
'level1' => array [
'level2' => array [
Example::__set_state(object)[]
],
],
];
?>
I guess there must be something wrong with regular expressions, which is that I can't determine it, i need add more space for Example::__set_state(object)[]
and add the spaces needed to the next line.