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
相关产品推荐
相关产品推荐

