何时使用strtr vs str_replace?


86

我很难理解何时strtr会更合适,str_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

除了语法之外,使用一种语法还有什么好处?在任何情况下都不足以达到预期的结果吗?


3
从可读性的角度来看,strtr这很容易被误读,因为strstr这是完全不同的。我开始认为我阅读困难。使用str_replace不会犯该错误。
Programster

Answers:


135

第一个区别:

之间不同的行为的一个有趣的例子strtr,并str_replace在PHP手册的注释部分:

<?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_replace是一种更全局的替换方法,而strtr只是简单地逐个转换字符。


另一个区别:

给定以下代码(摘自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);
?>

结果文本行将是:

字符串(3)“ PHP”
字符串(27)“ PHP:超文本预处理器”


主要说明:

发生这种情况是因为:

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

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

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

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

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

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

    3. 没有更多要查找的键,因此替换到此结束。


2
好的,谢谢!我不知道strtr是按长度翻译的-我认为它的顺序相反。
andrewtweber 2011年

如php.net中所述,函数str_replace还有1个名为“ count”的参数,用于指示替换应执行的时间。但是我还是无法使用此参数。有人知道为什么吗?
vantrung -cuncon 2012年

1
@ vantrung-cuncon这不是该参数的目的。文档说:“这将设置为执行的替换次数。” 如果要将str_replace限制为一定数量的替换项,则需要找到其他解决方案。
jdhartley 2012年

1
如果要将首字母缩写的第一次出现替换为扩展版本,即将“ WHO”的第一次出现更改为“ WHO(世界卫生组织)”,则限制替换的数量可能很有用。
米哈尔Tatarynowicz

strtr不会替换以前的替换文字。strtr('foo', array('oo' => 'ie', 'e' => 't'))返回'fie',而不是'fit'str_replace做。因此,它会自动解决@Pies带来的问题。
David Harkness,2014年

21

似乎可以使用任一功能获得完全相同的结果

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

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

7

我认为strtr与两个参数一起使用时,可以提供更灵活和有条件的替换,例如:如果string为1,则替换为a,但是如果string为10,则替换为b。此技巧只能通过来实现strtr

$string = "1.10.0001";  
echo strtr($string, array("1" => "a", "10" => "b"));  
// a.b.000a  

参见:PHP手册结构


2

注意手册STRTR--描述字符串strtr(字符串$ str,字符串$ from,字符串$ to)字符串strtr(字符串$ str,数组$ replace_pairs)如果给定三个参数,则此函数返回str的副本,其中...

STR_REPLACE-- ...如果搜索或替换的阵列,它们的元素被处理自始至终。...

STRTR每转一圈,NOT都不会影响下一个,但STR_REPLACE会。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.