PHP var_export()格式化脚本正则表达式缩进问题优化需求
解决var_export()对象输出缩进不一致的问题
我看了你的代码,核心问题出在处理对象类型时,Example::__set_state(object)[]这一行以及后续的__set_state内部结构没有继承前面的缩进层级,导致格式乱掉。咱们可以通过调整正则和缩进处理逻辑来修复这个问题:
第一步:调整对象替换的正则(替换原Check Point B的代码)
原来的正则只替换了文本内容,但没考虑前面的缩进。我们可以先捕获每一行的缩进空格,然后在替换时把这个缩进应用到对象内部的结构上:
// 替换原Check Point B的代码 $textvar = preg_replace_callback('/^(\\s*)array\\(\\K.*?Example::__set_state\\((.*?)\\)\\)/s', function($matches) { $indent = $matches[1]; $objectContent = $matches[2]; // 给对象内部的每一行加上当前层级的缩进 $indentedObject = preg_replace('/^/m', $indent . ' ', $objectContent); return "object)[]\n{$indent} {$indentedObject}"; }, $textvar);
第二步:优化数组处理时的缩进逻辑(可选,让整体格式更统一)
在处理数组的部分,原代码的缩进翻倍逻辑可以稍微调整,确保对象嵌套时的层级更清晰:
// 替换原数组处理里的preg_replace缩进翻倍 $textvar = preg_replace('~^ +~m', '$0 ', $textvar); // 改成每次加4个空格,而不是翻倍
修改后的完整VarExportFormat函数关键部分
整合后,你的VarExportFormat函数里的关键修改部分会变成这样:
#Main function to Format: function VarExportFormat($Var) { $textvar = ''; if (!is_array($Var)) { $textvar = var_export($Var, true); $textvar = preg_replace('~^ +~m', '$0 ', $textvar); // 统一缩进为4个空格 $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 ', $textvar); // 替换原翻倍逻辑,用固定4空格缩进 $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的正则,改成带缩进处理的回调 $textvar = preg_replace_callback('/^(\\s*)array\\(\\K.*?Example::__set_state\\((.*?)\\)\\)/s', function($matches) { $indent = $matches[1]; $objectContent = $matches[2]; // 给对象内部的每一行添加当前层级的缩进 $indentedObject = preg_replace('/^/m', $indent . ' ', $objectContent); return "object)[]\n{$indent} {$indentedObject}"; }, $textvar); $textvar = highlight_string("<?php \n#Output of Variable:\n" . $textvar . ";\n?>", true); return $textvar; }
为什么这样修改?
- 缩进捕获:通过正则捕获当前行的前置空格(
$matches[1]),确保对象标记和内部结构都继承这个层级的缩进。 - 内部缩进:给
__set_state里的内容每一行都加上额外的4个空格,形成嵌套层级,和数组的缩进逻辑保持一致。 - 统一缩进规则:把原来的缩进翻倍改成固定添加4个空格,避免多层嵌套时缩进过大,格式更整洁。
这样修改后,对象类型的输出就会和其他类型保持一致的缩进层级,不会再出现错位的问题了。
内容的提问来源于stack exchange,提问作者user10771503
相关产品推荐
相关产品推荐

