`substr_replace()` 可在字符串指定位置、指定長度替換為新字符串,比 `str_replace()` 更精確可控。本文說明語法、參數、常見用法與進階技巧。
mixed substr_replace (
mixed $string,
mixed $replacement,
mixed $start,
mixed $length = null
)
<?php
$msg = "Warning: System will shutdown in NN minutes!";
$pos = strpos($msg, "NN"); // 找到佔位符位置
echo substr_replace($msg, "15", $pos, 2) . "\n"; // Warning: System will shutdown in 15 minutes!
sleep(600); // 10分鐘後
echo substr_replace($msg, "5", $pos, 2) . "\n"; // Warning: System will shutdown in 5 minutes!
?>
$strings = [
"User {name} logged in",
"User {name} logged out"
];
$replacements = ["Alice", "Bob"];
$starts = [5, 5];
$lengths = [6, 6]; // {name} 長度 6
$results = substr_replace($strings, $replacements, $starts, $lengths);
print_r($results);
// Array ( [0] => User Alice logged in [1] => User Bob logged out )
$str = "abcdefghij";
// 從結尾倒數第 3 字符開始替換 2 個字符
echo substr_replace($str, "XY", -3, 2); // abcdefgXYj
// 負數 length:保留結尾 2 字符,其餘替換
echo substr_replace($str, "XY", 2, -2); // abXYij
// length = 0:插入不刪除
echo substr_replace($str, "XY", 3, 0); // abcXYdefghij
| 場景 | 實現方式 |
|---|---|
| 模板佔位符替換 | `strpos` 找位置 + `substr_replace` 替換 |
| 敏感詞遮罩(手機、身分證) | 固定位置替換為 `****` |
| 字符串插入(不刪除原字符) | `length = 0` |
| 截斷並添加省略號 | `substr_replace($str, '...', $maxLen)` |
| 格式化輸出(每 N 字符插入分隔符) | 循環計算位置插入 |
function maskPhone($phone) {
// 13812345678 → 138****5678
return substr_replace($phone, '****', 3, 4);
}
function maskIdCard($id) {
// 保留前 6 後 4,中間遮罩
$len = strlen($id);
return substr_replace($id, str_repeat('*', $len - 10), 6, $len - 10);
}
掌握 `substr_replace` 的靈活參數,能精準處理各類字符串定點修改需求。