【问题标题】:PHP http_build_query returns symbolsPHP http_build_query 返回符号
【发布时间】:2017-06-26 10:46:20
【问题描述】:

我一直在尝试使用 CURL 发布一些数据。 http_build_query 可能是我的问题。

我有一长串要发布的信息,例如与数组中的数据混合的数据。

看起来,当我执行 http_build_query 时,它会返回一个充满 stange 符号的 URL,如下所示:

contact[person]=testes83¶ms[make]=ford¶ms[model]=focus¶ms[version]=mk1-1998-2004

在我看来,这会在服务器尝试对其执行某些操作时导致错误。

我还有一个以“re”开头的词,在http_build_query之后,它被转换为®

'region_id' => 1,  

变成

'®gion_id' => 1,

这也是我正在使用的 http_build_query

 http_build_query($car_info,'', '&');

【问题讨论】:

  • http_build_query 可能是问题 [...],在我看来,它会导致错误您自己听起来不太相信,如果您问我,那就是正确的方法,因为我认为问题不在于http_build_query,因为所有这些基本上都是抓取一个数组并对键和值进行urlencode,并在它们之间粘贴=,在每个条目之间粘贴&。该过程中的任何内容都不应该真正用不合法的字符替换合法的 URL 字符。
  • 您在哪里/如何/何时看到?你是如何打印那个 URL 的?是否有任何东西试图使用某种编码来解释该 URL?例如,由于它似乎是序列&re,浏览器是否可能将其解释为 HTML 实体...?
  • 顺便说一句,它对我来说表现正常sandbox.onlinephpfunctions.com/code/…
  • “我一直在尝试使用 CURL 发布一些数据” -- 发布 curl 代码。 http_build_query() 工作正常,但这在很大程度上取决于您如何使用它构建的字符串。
  • "转换成'®gion_id' => 1," -- 你确定不是®ion_id

标签: php html curl


【解决方案1】:

我打赌你把http_build_quety()返回的字符串直接放入HTML,没有properly encoding the HTML entities

根据 HTML 标准,有四个字符 (<, >, & and ") 在 HTML 中作为普通字符使用时,应始终使用它们的 entities representation 正确编码:

  • < 必须编码为<
  • >>;
  • &&;
  • ""

HTML 字符实体始终以& 开头,并应以; 结尾。结尾 ; 是可选的,当不以 ; 结尾的字符实体后跟一些字符(空格字符、引号、点、逗号、< 等)时,浏览器可以成功识别它们。

但是当结尾;缺失时,允许浏览器尝试识别不完整的字符实体或忽略它并认为&代表它自己。

html_build_query()产生的字符串是:

contact[person]=testes83&params[make]=ford&region_id=1
  • 它将&para&params解释为(应该是¶);
  • 它将&reg&region解释为®(应该是®)。

浏览器是对的!

您的 HTML 无效,当这种情况发生时,允许浏览器随意更正它!

正如@Álvaro González 在a comment 中指出的那样(谢谢!),目前所有主流浏览器都可以识别不以; 结尾且后跟其他字母字符的字符实体(就像在URL 中那样) .

您必须始终使用htmlentities() 或至少htmlspecialchars() 对您动态构建的任何字符串进行正确编码,然后再将其作为文本放入HTML。 这包括 URL,即使它们被用作 hrefsrc HTML 属性的值。

【讨论】:

  • 在这种情况下,所有主流浏览器似乎都选择呈现为实体 - online demo
  • @ÁlvaroGonzález 你是对的,谢谢。我将您的评论放在答案中,这很有帮助。看来我对这个问题的了解已被弃用。上次我写一个字符实体时没有以; 正确结尾是在 15 年前。
  • 总是很难说它是一种普遍实施的解决方法,还是由规范(W3C 或 WHATWG)规定的。如果房间里有律师,请编辑答案并添加适当的引号,谢谢:)
  • 似乎浏览器将 &params=123 解释为 HTML 部分中的 ¶ms=123 (识别字符实体),这些部分旨在呈现(文本),但当字符串出现在 hrefsrc 属性的值中;他们期望那里有 URL,这是一个常见的错误,这就是他们在这种情况下原谅的原因。
  • 谢谢@axiac。我使用了 html 特殊字符,没有那些字符。
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 2012-11-12
  • 2022-07-09
  • 1970-01-01
相关资源
最近更新 更多