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



我有两个URLS,我想在其中替换'&'与'&amp'和'#'与'%23',所以我想我会使用:

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

但是替换'&"amp;"不会发生未受影响。在没有arays的情况下使用str_replace工作正常:

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

如果我更改'&amp'到另一个字符串,它工作正常。下面是一个代码片段来演示这个问题:

<?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;(甚至您的"故障"&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

最新更新