0

我设置了一个非常简单的代码片段:

$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的第一个正确答案。

4

3 回答 3

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);
}
于 2013-01-16T16:51:05.927 回答
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

于 2013-01-16T16:51:51.437 回答
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]);        
}
于 2013-01-16T16:50:19.810 回答