我已经设置了一个非常简单的代码片段:
$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的第一个正确答案
这是因为您的第二个语句使用$word
作为替换的主题,而不是$words[$i]
,这是您在第一次替换后分配字符串的地方。
你可以通过直接使用$words[$i]
来修复,或者只使用你的临时变量,然后像这样赋值:
for ($i = 0; $i < count($words); $i++) {
$word = $words[$i];
$word = str_replace(".", "!", $word);
$words[$i] = str_replace(",", "?", $word);
}
因为您一遍又一遍地将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
更改为:
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]);
}