【问题标题】:When to use strtr vs str_replace?何时使用 strtr 与 str_replace?
【发布时间】:2011-11-18 03:13:51
【问题描述】:

我很难理解何时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

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

【问题讨论】:

  • 从可读性的角度来看,strtr 很容易被误读为 strstr,这是完全不同的。我开始认为我有阅读障碍。使用 str_replace 不会犯这个错误。

标签: php string str-replace strtr


【解决方案1】:

第一个区别:

strtrstr_replace 之间的不同行为的一个有趣示例在 PHP 手册的 cmets 部分:

<?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 String Replacement Speed Comparison):

<?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"
string(27) "PHP:超文本预处理器"


主要解释:

发生这种情况是因为:

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

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

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

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

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

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

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

【讨论】:

  • 好的,谢谢!我没有意识到 strtr 是按长度翻译的 - 我以为它是相反的顺序。
  • 如 php.net 中所述,函数 str_replace 有另外 1 个名为“count”的参数来指示替换应该执行多少次。但无论如何我都无法使用这个参数。有谁知道为什么?
  • @vantrung-cuncon 这不是那个参数的用途。文档说:“这将设置为执行的替换次数。”如果要将 str_replace 限制为一定数量的替换,则需要找到其他解决方案。
  • 如果您想将首字母缩略词的第一次出现替换为扩展版本,例如将“WHO”的第一次出现更改为“WHO(世界卫生组织)”,则限制替换次数可能很有用.
  • strtr 不会替换以前替换插入的文本。 strtr('foo', array('oo' =&gt; 'ie', 'e' =&gt; 't')) 返回 'fie' 而不是 'fit' 就像 str_replace 那样。因此,它自动解决了@Pies 提出的问题。
【解决方案2】:

似乎使用任一函数都可以达到完全相同的结果

这并不总是正确的,取决于您提供的搜索和替换数据。例如两个函数不同的地方见:Does PHP str_replace have a greater than 13 character limit?

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

【讨论】:

    【解决方案3】:

    我认为strtr 与两个参数一起使用时提供了更灵活和有条件的替换,例如:如果字符串为 1,则替换为 a,但如果字符串为 10,则替换为 b。这招只有strtr才能做到。

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

    请参阅:Php Manual Strtr

    【讨论】:

      【解决方案4】:

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

      STR_REPLACE-- ... 如果搜索或替换是数组,则从头到尾处理它们的元素。 ...

      STRTR 每回合不影响下一回合,但 STR_REPLACE 有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多