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

PHP如何从报错字符串中error位置截取内容到第一个逗号

问题核心原因

  • 第一个致命错误:你的循环逻辑错误,往$msg数组里追加的是字符的下标数字$i,不是下标对应的实际字符串内容,所以最终implode后得到的根本不是你要的报错文本,全是数字拼接结果。
  • 第二个逻辑漏洞:你硬编码了截取起始位置偏移11、以及用逗号作为结束标志,只适配了400错误返回JSON的场景,当遇到404这类返回HTML结构的报错时,根本不存在你要匹配的JSON结构和逗号,stripos($message, $fin)会返回false,计算出来的$pos_fin会变成负数,截取逻辑完全失效。
  • 第三个兼容问题:你没有判断strripos、stripos的返回值是否为false,当返回值不存在时,后续的加减计算全是异常值,自然会把原始完整报错甚至无关内容存入数据库。

修复方案

正确截取代码实现

$this->setTicketStatus('error');
$message = $exception->getMessage();
$splitFlag = 'response:';
// 先判断response标识是否存在
$posStart = strripos($message, $splitFlag);
if ($posStart === false) {
    // 没有找到标识直接存原始报错前200字符即可,避免异常
    $errorContent = mb_substr($message, 0, 200);
} else {
    // 拿到response后面的所有内容
    $responseContent = trim(substr($message, $posStart + strlen($splitFlag)));
    // 匹配你要的ticket错误信息段
    $matchResult = preg_match('/{"error":\s*{"message":\s*{"ticket":\s*\["[^"]+"\]/', $responseContent, $matches);
    if ($matchResult && isset($matches[0])) {
        $errorContent = $matches[0];
    } else {
        // 匹配不到JSON结构就取返回内容前200字符,兼容HTML报错场景
        $errorContent = mb_substr($responseContent, 0, 200);
    }
}
$this->setMessageError($errorContent);

方案说明

  • 用正则匹配替换硬编码下标截取,适配JSON结构的报错场景,只要存在ticket字段的错误信息就能精准提取
  • 增加了匹配失败的兜底逻辑,遇到404这类HTML报错也不会输出异常内容,只会截取前200字符存储,避免数据库存入无效乱码
  • 所有位置查找都增加了存在性判断,避免偏移量计算异常导致的逻辑错误

内容的提问来源于stack exchange,提问作者user252529

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:24:05