You need to enable JavaScript to run this app. PHP Curl报URL含非法字符?排查输入数组隐形字符问题
优惠活动
大模型
产品
解决方案
定价
更多

PHP Curl报URL含非法字符?排查输入数组隐形字符问题

报错根因

对着你贴的var_dump结果数字符长度,一眼就能看出问题:

  • 正常文件名150812.mp4本身长度就是10个字符(6位数字+.mp44个字符),你看到前4个数组元素长度是11,多出来的1个就是每行尾巴上粘的不可见\r。Windows系统下的textarea提交的换行是\r\n两个字符组成的,你现在只按\n切字符串,相当于把\r直接留在了每一行的末尾,这个字符不可见,打印也看不出来,但是拼到URL里就会直接触发非法字符报错。
  • 最后一个数组元素长度是10,就是因为它是输入内容的最后一行,后面没有换行符,自然没带多余的\r,和你的var_dump输出完全对得上。
  • 哪怕把\r清干净了,你现在直接把用户输入的文件名往URL查询参数里塞,但凡有个空格、特殊符号,照样报URL非法的错,这是写HTTP请求的基本规范问题。
落地修复步骤

1. 解决文本切分的隐形字符残留

不要直接用explode("\n", $_POST['comment'])切分输入,先统一处理所有换行相关的不可见字符,再生成数组:

// 读取原始提交内容
$raw_input = $_POST['comment'];
// 统一把Windows换行、孤立回车替换为标准换行符
$raw_input = str_replace(["\r\n", "\r"], "\n", $raw_input);
// 切分数组后,清理每一行首尾的不可见空白字符,同时过滤空行
$array_items = array_filter(array_map('trim', explode("\n", $raw_input)));

这段代码会自动清掉每一行首尾的回车符、空格、制表符等不可见字符,同时把输入里的空行直接过滤掉,避免无效循环。

2. 拼接URL时必须对参数做编码

只要往URL里拼接用户可控的输入内容,就必须用标准URL编码处理参数值,不然任何特殊字符都会触发URL非法报错:
把原来设置curl请求URL的代码:

curl_setopt($ch, CURLOPT_URL, "https://api.box.com/2.0/search?query=$file_name");

修改为:

// 对query参数做标准URL编码
$request_url = "https://api.box.com/2.0/search?query=" . urlencode($file_name);
curl_setopt($ch, CURLOPT_URL, $request_url);

3. 增加匹配结果的兜底判断

避免搜索不到对应文件时,数组下标不存在触发的报错:

$arr = json_decode($result, true);
// 没匹配到文件就跳过,不中断流程
if (empty($arr['entries'][0])) {
    echo "未查询到对应文件:{$file_name} <br>";
    continue;
}
$file_id = $arr["entries"][0]["id"];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 09:06:07