3
php > echo str_replace(
    array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'),
    array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'),
    '01234567890abcdef') . PHP_EOL;
klmnopghijkklmnop

我希望这个str_replace()电话能给我类似的东西abcdefghijklmnop。但似乎我的搜索数组中的数字字符串被视为字符串以外的东西。

当然,我最终只是追求tr(1)(例如tr a-f k-p | tr 0-9 a-j)的功能,但使用纯 php 而不是 shellout。

我在 php-5.4.10--pl0-gentoo 和 php-5.5.4-pl0-gentoo 上看到了同样的行为,所以我认为这不仅仅是一个 PHP 版本的侥幸。为什么 str_replace() 会奇怪地处理搜索数组中的数字——它又是如何处理它们的?

4

4 回答 4

2

您可以在 PHP 中使用strtr函数:

echo strtr( '01234567890abcdef', '0123456789abcdef', 'abcdefghijklmnop' ) . PHP_EOL;
// abcdefghijaklmnop
于 2013-11-05T07:43:25.440 回答
1

手册

因为 str_replace() 从左到右替换,所以在进行多次替换时,它可能会替换先前插入的值。另请参阅本文档中的示例。

它只是替换已经替换的值,这就是你得到“奇怪结果”的原因

例子:

第一个结果字母是K而不是A它,因为0被替换为A然后A被替换为K。当你这样想时,你会看到这个函数的正确结果。

于 2013-11-05T07:42:07.493 回答
0

替换按顺序应用,并且针对每个替换选项从头到尾扫描整个字符串。

第一次更换时更换0为正常,第十次更换时更换为正常。aak

您要实现的是不对已经替换的字符串执行替换。我认为这将被认为是不直观/意外的行为。

告诉我们您希望将其应用于哪些实际用例,以便我们提供更实用、更直接的解决方案;正确工作的正确工具。

于 2013-11-05T07:40:04.533 回答
0

我认为您正在寻找的是 strtr - http://www.php.net/manual/en/function.strtr.php

于 2013-11-05T07:43:59.890 回答