Php 在使用http\u build\u查询时,如何用“+”替换“%2”?

Php 在使用http\u build\u查询时,如何用“+”替换“%2”?,php,Php,我使用的确实是api,我有一个数组,如下所示: $request = [ 'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36', 'userip' => 1.2.3.4, 'q' => 'agricultural+OR+agricul

我使用的确实是api,我有一个数组,如下所示:

$request = [
    'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    'userip' => 1.2.3.4,
    'q' => 'agricultural+OR+agriculture+OR+agronomic+OR+farm+OR+farming+OR+harvesting+OR+horticulture+OR+livestock',
]
当我使用http_build_查询时,它会删除“+”并在查询的“q”部分用“%2”替换它们

print('?'.http_build_query($request));
// ?useragent=Mozilla%2F5.0%20%28Macintosh%3B%20Intel%20Mac%20OS%20X%2010_12_6%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userip=1.2.3.4q=agricultural%2BOR%2Bagriculture%2BOR%2Bagronomic%2BOR%2Bfarm%2BOR%2Bfarming%2BOR%2Bharvesting%2BOR%2Bhorticulture%2BOR%2Blivestock
如果在查询的“q”部分使用“%2”,则API确实不起作用。我去做了一个字符串替换,但它与查询的“useragent”部分发生了冲突

print('?'.http_build_query($request));
// ?useragent=Mozilla%2F5.0%20%28Macintosh%3B%20Intel%20Mac%20OS%20X%2010_12_6%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userip=1.2.3.4q=agricultural%2BOR%2Bagriculture%2BOR%2Bagronomic%2BOR%2Bfarm%2BOR%2Bfarming%2BOR%2Bharvesting%2BOR%2Bhorticulture%2BOR%2Blivestock
如何才能使查询的“q”部分正确地包含“+”?我应该自己手动构建吗?

问题是您的q值已经是URL编码的-+是在URL中编码空间的方法之一,也可以编码为%20。然后,当您调用http_build_query之类的函数时,它会再次被编码,但API不希望它是双重编码的

首先,您不应该对$request['q']进行编码。如果无法修复源,可以先对其进行解码:

$request['q'] = urldecode($request['q']);
print('?'.http_build_query($request));

*%2B,不仅仅是%2。是的。谢谢:。首先,你不应该在q值中有+。这是空格字符的URL编码,不需要编码两次。用户代理值不是URL编码的,而q已经是URL编码的。如果你平等对待它们,你就不能真正期望得到一致的结果。这将导致空间被编码成百分比,而目标服务器可能会也可能不会这样做。@deceze它确实应该这样做。不幸的是,现实有时会介入…当然,它可能会起作用。只是指出它可能不会,因为它不同于表面上正常工作的版本。任何东西都可能在存在bug的情况下崩溃,不可能保护所有东西。我假设符合标准。