2017-12-16 3 views
0

私は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>'; 

それは、回目になるはずであるが PPER

を共同それはに結果:

co lor:teal; ">土地co pper

bacause str_replace()は、$ dの値を置き換えるだけでなく、$ cの値を置き換えるだけでなく、2回目の繰り返しでも$ cにhtmlタグが含まれます。私の見解では、これはプログラミング言語にはあまり意味がありません。これを回避するにはどうしますか?

+0

'strtr'に置き換えて –

+0

この動作は、その機能のマニュアルページで警告されています。http://php.net/str_replaceなぜ、その代替手段は実装するのがはるかに難しいです。 – IMSoP

+0

投稿者の名前またはあなたが参照した投稿数を教えてもらえますか?ありがとう:-) –

答えて

3

ソリューションで一つのことを行います。

$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>'; 

説明:

あなたのライン

echo '<a href="#">'.str_replace($a, $boldeda, $d=$c).'</a>'; 

はを行うには何もを持っていませんまたは$cstr_replaceは、操作$d=$cの結果である値を$aから$boldedaに変更します。この割り当ての結果は、文字列land of copperであり、$d$cの両方がのままです。です。これを確認するにはを出力してください。あなたはそれがあなたのことを伝えます交換注文落とし穴を持っていることがわかりますstr_replaceマニュアルページに、さらに行く

:str_replace()が代わるので

が左から右へと、それは以前に挿入された値を置き換える可能性があります複数の置換を行う。

ので、str_replaceはまず、その中にcolorを持っているタグでlaを置き換え と第二str_replace新しい置換でcoを置き換えます。残念ながら、colorという語はcoでもなので、すでに置き換えられているものを「覚えていない」とは言わないので、str_replaceも置き換えられます。

+0

残念ながら、それは$ boldedaが太字化されたり、スタイル付けされなくなったりします:-( –

+0

'boldela'は__array__です。そして__fortunately__、それはhttps://3v4l.org/QZV4lです –

+0

私は知っていますが、 –

0

あなたはそれが$cの値に$dを割り当て、その値を返します。この部分は

$d=$c 

を何だと思います。

ただstrtrと時間

+0

私は$ d = $ cを外側に、$ dをstr_replaceの内側に置いたときと同じです。 –

+0

@ G.ManJi - 同じことをします。 '$ c'をstr_replace()に渡すのと同じです。 '$ d'を全く必要としません。 –

関連する問題