我已经设置了一个非常简单的代码段:
$string = 'Some random words. Some more random, very random words.';
$words = explode(" ", $string);
for ($i = 0; $i < count($words); $i++) {
$word = $words[$i];
$words[$i] = str_replace(".", "!", $word);
$words[$i] = str_replace(",", "?", $word);
}
print_r($words);
输出是这样的:
Array
(
[0] => Some
[1] => random
[2] => words.
[3] => Some
[4] => more
[5] => random?
[6] => very
[7] => random
[8] => words.
)
为什么只有第二个str_replace()
函数会影响字符串?如果我删除第二个str_replace()
,第一个就完美无缺。这不是关于str_replace()
的使用,但我相信我做的事情非常非常错误。
顺便说一句 - 我知道preg_replace()
并将数组传递给str_replace()
,但我想知道这种特殊情况:)。
修改 谢谢大家快速回复。我对这样的问题感到羞耻,但起初它并没有引起我的注意。感谢大家!我将接受 Mike Brant 的第一个正确答案。
答案 0 :(得分:4)
这是因为您的第二个语句使用$word
作为替换主题,而不是$words[$i]
,这是您在第一次替换后分配字符串的位置。
您可以通过直接使用$words[$i]
整个时间进行修复,或者专门使用您的临时变量进行修复,然后进行如此分配:
for ($i = 0; $i < count($words); $i++) {
$word = $words[$i];
$word = str_replace(".", "!", $word);
$words[$i] = str_replace(",", "?", $word);
}
答案 1 :(得分:2)
因为您一遍又一遍地将str_replace
应用于同一个字符串。您需要重新分配新字符串(使用已替换的字符)并对更新后的值
for ($i = 0; $i < count($words); $i++) {
$word = $words[$i]; //initial value
$word = str_replace(".", "!", $word); //change $word to modified text
$word = str_replace(",", "?", $word); //change $word to modified text
$words[$i] = $word;
}
$word
str_replace
值不会被str_replace
更改,因此它保持不变。要更改它,您需要从{{1}}
答案 2 :(得分:1)
更改为:
for ($i = 0; $i < count($words); $i++) {
$words[$i] = str_replace(".", "!", $words[$i]);
$words[$i] = str_replace(",", "?", $words[$i]);
}
更短:
for ($i = 0; $i < count($words); $i++) {
$words[$i] = str_replace(array(".", ","), array("!", "?"), $words[$i]);
}