何时使用 strtr 与 str_replace?

2022-08-30 07:59:07

我很难理解什么时候会更好,反之亦然。似乎可以使用任何一个函数获得完全相同的结果,尽管子字符串的替换顺序是相反的。例如:strtrstr_replace

echo strtr('test string', 'st', 'XY')."\n";
echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n";
echo str_replace(array('s', 't', 'st'), array('X', 'Y', 'Z'), 'test string')."\n";
echo str_replace(array('st', 't', 's'), array('Z', 'Y', 'X'), 'test string');

此输出

YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring

除了语法之外,使用一个而不是另一个有什么好处吗?任何一个不足以达到预期结果的情况?


答案 1

第一个区别:

和 之间不同行为的一个有趣例子是 PHP 手册的评论部分:strtrstr_replace

<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
  • 我期望结果是:“ZDDB”
  • 但是,此返回:“ZDDD”(因为根据我们的数组,B = D)

要使此功能正常工作,请改用“strtr”:

<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
  • 这将返回:“ZDDB”

这意味着这是一种更全球化的替换方法,同时简单地逐个翻译字符。str_replacestrtr


另一个区别:

给定以下代码(取自 PHP 字符串替换速度比较):

<?php
$text = "PHP: Hypertext Preprocessor";

$text_strtr = strtr($text
    , array("PHP" => "PHP: Hypertext Preprocessor"
        , "PHP: Hypertext Preprocessor" => "PHP"));
$text_str_replace = str_replace(array("PHP", "PHP: Hypertext Preprocessor")
    , array("PHP: Hypertext Preprocessor", "PHP")
    , $text);
var_dump($text_strtr);
var_dump($text_str_replace);
?>

生成的文本行将是:

string(3) “PHP”
string(27) “PHP: Hypertext Preprocessor”


主要解释:

发生这种情况是因为:

  • strtr:它按长度按降序对其参数进行排序,因此:

    1. 它将“更重要”地赋予最大的一个,然后,由于主题文本本身是替换数组的最大键,因此它被翻译。
    2. 因为主题文本的所有字符都被替换了,所以该过程就此结束。
  • str_replace:它按照键的定义顺序工作,因此:

    1. 它在主题文本中找到密钥“PHP”,并将其替换为:“PHP:超文本预处理器”,结果如下:

      “PHP:超文本预处理器:超文本预处理器”。

    2. 然后它在前一步的结果文本中找到下一个键:“PHP:超文本预处理器”,因此它被替换为“PHP”,结果如下:

      “PHP:超文本预处理器”。

    3. 没有更多的密钥要查找,因此替换就此结束。


答案 2

似乎可以使用任何一个函数获得完全相同的结果

这并不总是正确的,这取决于您提供的搜索和替换数据。例如,如果两个函数不同,请参阅:PHP str_replace是否具有大于 13 个字符的限制?

  • strtr 不会替换已经替换的字符串部分 - str_replace将替换内部替换。
  • strtr将首先从最长的键开始,以防您用两个参数调用它 - 将从左到右替换。str_replace
  • str_replace可以返回完成的替换次数 - 不提供这样的计数值。strtr

推荐