PHP str_replace 在数据数组上使用 $amp 的奇怪行为

Odd behaviour with PHP str_replace using $amp on arrays of data

我有 2 个 URL,其中我想将“&”替换为“&”,将“#”替换为“%23”,所以我想使用:

list($upUrl, $downUrl) = str_replace(["&", "#"], ["&amp", "%23"], [$upUrl, $downUrl]);

但是“&”的替换没有发生——“&”保持不变。在没有数组的情况下使用 str_replace 可以正常工作:

$upUrl = str_replace("&", "&amp", $upUrl);

如果我将“&”更改为另一个字符串,它就可以正常工作。下面是演示该问题的代码片段:

<?php
define("NL", "\n<br>");

$upUrl = "upUrl ampersand=& hash=#";
$downUrl = "downUrl ampersand=& hash=#";

echo $upUrl.NL;
echo $downUrl.NL.NL;

list($upUrl, $downUrl) = str_replace(["&", "#"], ["&amp", "%23"], [$upUrl, $downUrl]);

echo $upUrl.NL;
echo $downUrl.NL.NL;

$upUrl = str_replace("&", "&amp", $upUrl);

echo $upUrl.NL;
echo $downUrl.NL;

?>

用“\”转义“&”没有区别。

问题:我做错了什么还是这只是 PHP 的怪癖?

运行 浏览器中的这段代码使它 看起来像 没有进行任何替换,但它们实际上是,只是 &amp;(甚至您的 "faulty" &amp) 在浏览器中显示为 &。您的代码按预期工作:

upUrl ampersand=& hash=#
<br>downUrl ampersand=& hash=#
<br>
<br>upUrl ampersand=&amp hash=%23
<br>downUrl ampersand=&amp hash=%23
<br>
<br>upUrl ampersand=&ampamp hash=%23
<br>downUrl ampersand=&amp hash=%23
<br>

https://3v4l.org/6sPSR