这是php的一个bug吗?你会怎样';补丁';信息技术

这是php的一个bug吗?你会怎样';补丁';信息技术,php,Php,我正在用php处理这个简单的脚本: $a = array('la','co'); foreach ($a as $unboldeda){ $boldeda[] = '<b style="color: teal;">'.$unboldeda.'</b>'; } $c = 'land of copper'; echo '<a href="#">'.str_replace($a, $boldeda, $d=$c).'</a>'; $a=arra

我正在用php处理这个简单的脚本:

$a = array('la','co');
foreach ($a as $unboldeda){
    $boldeda[] = '<b style="color: teal;">'.$unboldeda.'</b>';
}
$c = 'land of copper';
echo '<a href="#">'.str_replace($a, $boldeda, $d=$c).'</a>';
$a=array('la','co');
foreach($a作为$unboldeda){
$boldeda[]='.$unboldeda';
}
$c=‘铜之地’;
回声';
这将导致 landcopper

但其结果是:

color:teal;“copper之地


因为str_replace()不仅替换了$d的值,而且还替换了$c的值,因此在第二次迭代中,$c还将包含html标记。在我看来,这对编程语言来说没有多大意义。您如何解决这一问题?

您认为这一部分的作用是什么

$d=$c
它将
$d
赋值给
$c
的值,然后返回该值


一次只做一件事

你认为这部分做什么

$d=$c
它将
$d
赋值给
$c
的值,然后返回该值


一次只做一件事

使用
strtr解决方案

$a = array('la','co');
foreach ($a as $unboldeda){
    $boldeda[$unboldeda] = '<b style="color: teal;">'.$unboldeda.'</b>';
}
$c = 'land of copper';
echo '<a href="#">'.strtr($c, $boldeda).'</a>';
$a=array('la','co');
foreach($a作为$unboldeda){
$boldeda[$unboldeda]='.$unboldeda'.';
}
$c=‘铜之地’;
回声';
说明:

你的线路

echo '<a href="#">'.str_replace($a, $boldeda, $d=$c).'</a>';
echo';
$d
$c
无关。
str_replace
将值中的项目从
$a
更改为
$boldeda
,这是操作的结果
$d=$c
。此分配的结果是字符串
铜地
,您的
$d
$c都是未触及的。您可以通过输出它们来检查这一点。

更进一步,在
str_replace
手册页上,您将看到它有替换顺序gotcha,它告诉您:

因为str_replace()从左向右替换,所以在执行多次替换时,它可能会替换以前插入的值

因此,
str\u replace
首先将
la
替换为标签,标签中有
颜色

第二个
str\u replace
用一个新的替换物替换
co
。不幸的是,word
color
也有
co,因此,
stru replace
也替换了它,因为它不“记住”已经替换的内容和没有替换的内容。

strtrtrtrtr>的解决方案:

$a = array('la','co');
foreach ($a as $unboldeda){
    $boldeda[$unboldeda] = '<b style="color: teal;">'.$unboldeda.'</b>';
}
$c = 'land of copper';
echo '<a href="#">'.strtr($c, $boldeda).'</a>';
$a=array('la','co');
foreach($a作为$unboldeda){
$boldeda[$unboldeda]='.$unboldeda'.';
}
$c=‘铜之地’;
回声';
说明:

你的线路

echo '<a href="#">'.str_replace($a, $boldeda, $d=$c).'</a>';
echo';
$d
$c
无关。
str_replace
将值中的项目从
$a
更改为
$boldeda
,这是操作的结果
$d=$c
。此分配的结果是字符串
铜地
,您的
$d
$c都是未触及的。您可以通过输出它们来检查这一点。

更进一步,在
str_replace
手册页上,您将看到它有替换顺序gotcha,它告诉您:

因为str_replace()从左向右替换,所以在执行多次替换时,它可能会替换以前插入的值

因此,
str\u replace
首先将
la
替换为标签,标签中有
颜色


第二个
str\u replace
用一个新的替换物替换
co
。不幸的是,单词
color
也有
co,所以,
str\u replace
也替换了它,因为它不“记住”“什么已经被替换,什么没有被替换。

替换为
strtr
此行为在该功能的手册页上得到警告:至于为什么,替代方案更难实现。请告诉我您所指的贡献者的姓名或贡献者的号码?谢谢:-)替换为
strtr
此行为在该功能的手册页上有警告:至于为什么,替代方案更难实现。请告诉我您所指的贡献者姓名或贡献者编号?谢谢:-)当我把$d=$c放在外面,只把$d放在里面时也是一样的_replace@G.ManJi-那也一样。这与将
$c
传递给str_replace()完全相同。根本没有理由涉及到
$d
。当我把$d=$c放在外面,把$d放在里面时也是一样的_replace@G.ManJi-那也一样。这与将
$c
传递给str_replace()完全相同。根本没有理由涉及
$d
。不幸的是,这会导致$boldeda不再粗体或样式化:-(
boldela
是数组。幸运的是,它是我知道的,但我听不懂你说的。我该怎么办?@G.ManJi u_mulder的答案有什么问题?它很有效。不,不,u_mulder的答案是可以的,现在我已经理解了。我没有看到这个修改$boldeda[$unboldda]-它现在可以工作不幸的是它不能工作,它导致$boldeda不再粗体或样式化:-(
boldela
是数组。幸运的是,它是我知道的,但我不能理解。我应该怎么做?@G.ManJi u\u mulder的答案有什么问题吗?它可以工作。不,u\u mulder的答案没问题,现在我已经理解了。我没有看到这个修改$boldeda[$unboldda]-现在可以用了