strtr() 是 PHP 核心字符串替換函數,以「快」著稱(號稱比 str_replace() 快 4 倍),但其行為特異,用不好易產生難以排查的 Bug。本文深度解析其兩種調用模式、核心陷阱與最佳實踐。
// 模式一:字符級映射(三參數) strtr(string $str, string $from, string $to) : string // 模式二:子串級映射(二參數,推薦) strtr(string $str, array $replace_pairs) : string
<?php
echo strtr("I Love you", "Lo", "lO");
// 輸出: I lOve yOu
// 解析: L→l, o→O,逐字符映射,"you" 中的 o 也被替換為 O
?>
<?php
echo strtr("I Love you", "Love", "");
// 輸出: I Love you (無任何變化)
// 原因: $to 為空時函數直接返回原字符串
?>
<?php
echo strtr("I Loves you", "Love", "lOvEA");
// 輸出: I lOvEs yOu
// 解析: L→l, o→O, v→v, e→E,A 被忽略;"you" 中 o→O
?>
<?php
// $from 長度 > $to 長度
echo strtr("paocai!", "pao", "bai123");
// 輸出: baicai! (非預期的 bai123cai!)
// 解析: 只取 $to 前 3 字符 "bai",p→b, a→a, o→i
// $from 長度 < $to 長度
echo strtr("paocai!", "pao", "la");
// 輸出: laocai! (非預期的 lacai!)
// 解析: 只取 $to 前 3 字符 "la" + 隱含補位?實際行為極其詭異
?>
結論:模式一行為類似 C 語言
tr命令,極不推薦用於子串替換,僅適用於單字符映射(如大小寫轉換、字符清洗)。
<?php
$table = [
'you' => 'her sister',
'Love' => 'hate',
];
echo strtr("I Love you", $table);
// 輸出: I hate her sister
// 動態構建替換表
$table_change = ['you' => 'her sister'];
$table_change += ['Love' => 'hate']; // 合併數組
echo strtr("I Love you", $table_change); // I hate her sister
?>
str_replace()<?php
$str = str_repeat("abcdefghijklmnopqrstuvwxyz ", 10000); // ~27萬字符
$replace = array_combine(range('a','z'), range('A','Z'));
// strtr
$start = microtime(true);
strtr($str, $replace);
echo "strtr: " . (microtime(true) - $start) . "s\n"; // ~0.008s
// str_replace
$start = microtime(true);
str_replace(array_keys($replace), array_values($replace), $str);
echo "str_replace: " . (microtime(true) - $start) . "s\n"; // ~0.035s
// 結論: strtr 約 4-5 倍快
?>
<?php
function renderTemplate($tpl, $data) {
// 鍵加前綴避免衝突
$pairs = [];
foreach ($data as $k => $v) {
$pairs["{{$k}}"] = $v;
}
return strtr($tpl, $pairs);
}
$template = "Hello {{name}}, welcome to {{site}}!";
echo renderTemplate($template, ['name' => '張三', 'site' => 'PHP中國']);
// Hello 張三, welcome to PHP中國!
?>
<?php
$htmlEntities = [
'&' => '&',
'<' => '<',
'>' => '>',
'"' => '"',
"'" => ''',
];
function htmlEncode($str) {
global $htmlEntities;
return strtr($str, $htmlEntities);
}
function htmlDecode($str) {
global $htmlEntities;
return strtr($str, array_flip($htmlEntities));
}
?>
<?php
$badWords = [
'傻逼' => '**',
'操蛋' => '**',
'垃圾' => '**',
];
function filterBadWords($content) {
global $badWords;
return strtr($content, $badWords);
}
?>
strtr($str, ['from' => 'to'])ab 和 abc),雖然內部按長度降序處理,但語義更清晰preg_replace(),strtr() 不支持正則strtr() 是 PHP 字符串處理的「隱藏高手」:用對模式(關聯數組)是性能王者,用錯模式(三參數)是 Bug 溫床。牢記「拒絕三參數,擁抱關聯數組」,發揮其極致性能優勢。