<?php
/**
 * JSON解析辅助函数
 * 用于处理数据库中存储的非标准JSON数据
 */

if (!function_exists('parse_json_safe')) {
    /**
     * 安全地解析JSON字符串，处理包含换行符和未转义反斜杠的情况
     * @param string $json JSON字符串
     * @param bool $associative 是否返回关联数组
     * @return array|object|false 解析成功返回数组或对象，失败返回false
     */
    function parse_json_safe($json, $associative = true) {
        if (empty($json)) {
            return $associative ? [] : new stdClass();
        }

        // 首先尝试直接解析
        $result = json_decode($json, $associative);
        if ($result !== null || json_last_error() === JSON_ERROR_NONE) {
            return $result;
        }

        // 直接解析失败，进行清理
        $cleaned = clean_json_string($json);

        // 再次尝试解析
        $result = json_decode($cleaned, $associative);
        if ($result !== null || json_last_error() === JSON_ERROR_NONE) {
            return $result;
        }

        // 如果还是失败，记录错误并返回false
        return false;
    }
}

if (!function_exists('clean_json_string')) {
    /**
     * 清理JSON字符串，处理换行符和未转义的反斜杠
     * @param string $json JSON字符串
     * @return string 清理后的字符串
     */
    function clean_json_string($json) {
        // 移除UTF-8 BOM
        $json = preg_replace('/^\xEF\xBB\xBF/', '', $json);

        // 步骤1: 替换换行符为转义的\n
        $json = str_replace("\r\n", "\\n", $json);
        $json = str_replace("\r", "", $json);
        $json = str_replace("\n", "\\n", $json);

        // 步骤2: 转义反斜杠（除了已经转义的\n）
        $placeholder = "\x00NEWLINE\x00";
        $json = str_replace("\\n", $placeholder, $json);
        $json = str_replace("\\", "\\\\", $json);
        $json = str_replace($placeholder, "\\n", $json);

        // 步骤3: 处理其他特殊字符
        // 转义制表符
        $json = str_replace("\t", "\\t", $json);

        // 移除其他控制字符
        $json = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $json);

        return $json;
    }
}
