【问题标题】:Ampersand problem in XML when creating a URL String创建 URL 字符串时 XML 中的 & 符号问题
【发布时间】:2011-09-25 01:20:39
【问题描述】:

我正在使用一个 XML 提要,它的节点之一是一个类似于以下内容的 URL 字符串:

http://aflite.co.uk/track/?aid=13414&mid=32532&dl=http://www.google.com/&aref=chris

我知道 & 符号会在 XML 中引起很多问题,应该使用 & 而不是赤裸裸的 & 来转义。因此,我将 php 更改为如下:

<node><?php echo ('http://aflite.co.uk/track/?aid=13414&amp;mid=32532&amp;dl=http://www.google.com/&amp;aref=chris'); ?></node>

但是,当它生成 XML 提要时,字符串会显示为完整的 &amp;amp; 所以实际的 URL 不起作用。如果这是一个非常基本的误解,我们深表歉意,但一些指导会很棒。

我也尝试过使用%26 而不是&amp;amp;,但仍然遇到同样的问题。

【问题讨论】:

  • &amp;amp; 是正确的。如果解析器在将 XML 节点值转换为字符串时未对其进行解码,则解析器已损坏,您需要修复它而不是 XML。
  • 您不应该使用普通的 echo 语句创建 XML。相反,请使用 SimpleXML 或 XMLWriter:它们都会为您处理脏细节。

标签: php xml url ampersand


【解决方案1】:

如果您要在 XML/HTML 中插入内容,您应该始终使用 htmlspecialchars 函数。这会将您的字符串转义为正确的 XML 语法。

但是您遇到了第二个问题。 您已在第一个网址中添加了第二个网址。 这种需求也转义为 url 语法。 为此,您需要使用urlencode

<node><?php echo htmlspecialchars('http://aflite.co.uk/track/?aid=13414&mid=32532&aref=chris&dl='.urlencode('http://www.google.com/')); ?></node>

【讨论】:

  • 如果他在一个已经转义&amp;amp;的字符串上使用htmlspecialchars(),他最终会得到一个双转义字符串。
  • 是的,他的示例代码不起作用。当我看到第二个附加的 url 时,我更正了我的示例。
  • 您已经更新了答案,这很好;没有更多的双重转义。但有趣的是,我注意到您添加的 urlencode() 部分:原始问题中没有任何内容指定 aref=chris 是谷歌 URL 的一部分,而不是主 URL 的另一个参数。如果是,那么您的回答很好,并且还解释了为什么尽管逃跑了它对他不起作用。但是,还有一个问题,如果aref=chris 是google URL 的一部分,那么它需要在前面加上一个问号,而不是一个& 符号,以及贯穿urlencode()
  • 是的,你是对的。 &ahref 不是谷歌网址的一部分。谷歌 url 包含他在他的 url 中需要的任何字符。这还包括一个?。
  • +1。尽管如此,我还是会投票给你,因为这里提出了一些我在回答中没有的好点。 :)
【解决方案2】:

&amp;amp; 在 XML 文档中转义 & 符号是正确的。您给出的示例应该有效。

您声明它不起作用,但您没有说明您正在使用什么应用程序,或者它以何种方式不起作用。单击链接时究竟会发生什么? &amp;amp; 字符串是否最终出现在浏览器的 URL 字段中?如果是这种情况,这听起来像是您用来查看 XML 的软件有问题。您是否尝试在另一个应用程序中查看 XML 以查看问题是否一致?

要回答您问题的最后一部分:%26 绝对不适合您——如果您的 URL 参数需要包含 & 符号,您可以使用它。例如在aref=chris 中,如果名称chris 是一个& 符号(假设用户名是chris&amp;bob),那么这个& 符号需要使用%26 进行转义,这样URL 解析器就看不到它作为一个新的 URL 参数的开始。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2010-10-16
    • 2011-05-20
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多