You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:27:08