从TXT文件提取字符串并通过CURL发送时的JSON格式问题
问题分析
核心问题是提取的文本包含隐藏换行符,导致手动拼接的JSON格式非法;同时生成TXT文件的逻辑存在换行符处理不当的问题,可能引发读取时内容跨行的异常。
解决方案
1. 清理提取内容中的空白字符
无论生成文件时的换行符如何处理,提取$text后都应主动清理多余的换行、空格等空白字符,避免破坏JSON结构:
// 修改原提取逻辑 if ($pos !== false) { $ampPos = strpos($line, "&"); if ($ampPos !== false) { $text = substr($line, $ampPos + 1); // 移除首尾所有空白字符(含换行、空格、制表符) $text = trim($text); echo $text; break; } }
trim()能彻底清除字符串首尾的干扰空白,确保$text为纯净的目标内容。
2. 用json_encode()生成合法JSON
手动拼接JSON极易因特殊字符(如引号、换行)导致格式错误,推荐使用PHP内置的json_encode()自动生成:
// 替换原CURL POSTFIELDS配置 CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode(['string' => $text]), // 必须设置JSON请求头 CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', ],
该方法会自动转义特殊字符,从根源上避免JSON格式非法问题。
3. 修复TXT文件生成逻辑
当前生成代码存在两个问题:数组拼接内容无换行,导致多次追加的内容挤在同一行;开头加PHP_EOL会产生空行干扰读取。修改后:
$filename = 'output.txt'; $date = date("d/m-H:i : "); $eventid = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'), 1, 16); // 拼接成完整行,结尾加换行符确保每条记录独立 $lineContent = $date . 'eventid=' . $eventid . '&' . $string . PHP_EOL; // 直接传入字符串,避免数组拼接的不确定性 file_put_contents($filename, $lineContent, FILE_APPEND);
修改后每次追加的内容都是独立一行,fgets()读取时能精准获取单条记录。
4. 优化读取逻辑的鲁棒性
原代码未判断&是否在目标eventid之后,可能提取到无效内容,增加校验:
while (($line = fgets($handle)) !== false) { $pos = strpos($line, $eventid); if ($pos !== false) { $ampPos = strpos($line, "&"); // 确保&在eventid之后,避免提取无效内容 if ($ampPos !== false && $ampPos > $pos) { $text = substr($line, $ampPos + 1); $text = trim($text); echo $text; break; } } $count++; }
内容的提问来源于stack exchange,提问作者Glen
相关产品推荐
相关产品推荐

