PHP 我的字符串中的参数出现 urlencode 问题:“&notify_url”不正确 returns“¬ify_url”

PHP urlencode issue with a parameter in my string: "&notify_url" incorrectly returns "¬ify_url"

所以当我在下面的字符串上使用 PHP 的 urlencode 时,似乎出现了一个技术问题,我 think 在保留 PHP 字词“¬”上。

原字符串:

cancel_url=https://example.com/payment_cancelled&notify_url=https://example.com/order_notify

我使用url编码得到以下结果:

cancel_url=https%3A%2F%2Fexample.com%2Fpayment_cancelled¬ify_url=https%3A%2F%2Fexample.com%2Forder_notify

正如您在上面注意到的那样,它创建的特殊字符“¬”(就在单词 'cancelled' 之后)。所以对我来说,“¬ify_url”的“¬”部分似乎是一个运算符保留的运算符词(PHP 中的“¬”?)。

我试过PHP的str_replace函数url编码后如下:

$paramUrlString = str_replace('¬', '&not', $paramUrlString);
$paramUrlString = str_replace('&#170', '&not', $paramUrlString);

(也尝试该特殊字符的 ASCII 码)

我现在 运行 没主意了。请帮忙,谢谢。

urlencode 通常根本不会替换 &not,但会用 %26 替换 &。请参阅此处的示例:http://sandbox.onlinephpfunctions.com/code/e9d62797d01f8162170e5ad5181e14fc339faa52

您可以尝试在 urlencode 之前将 & 替换为 %26

$urlString = str_replace('&', '%26', $urlString);

并不是说 PHP 中的任何内容都在用 ¬ 替换字符串 &not,而是无论您使用什么 view/display 数据都在这样做。

鉴于不需要对实体关闭 ;,我敢打赌您将 URL 放入 XML 而没有正确转义实体。虽然 & 是 URL 和 XML 之间存在冲突的实体,但还有更多。

最简单的解决方案是,如果您要在 XML 文档中嵌入原始字符串,您需要调用:

$string = htmlspecialchars($string, ENT_XML1 | ENT_COMPAT);

另一方面,最佳 解决方案是完全不手动创建 XML 文档。使用像 DOMDocument or XMLWriter 这样的库。这不仅可以处理数据的 escaping/encoding,还可以处理创建适当 XML 文档的所有其他微妙的复杂性。