在字符串指定位置插入子串是常見操作。本文對比三種實現方式:手動遍歷、substr() 截取拼接、內置 substr_replace(),分析優缺點並推薦最佳實踐。
<?php
function str_insert($str, $pos, $substr) {
$startstr = $laststr = '';
for ($j = 0; $j < $pos; $j++) {
$startstr .= $str[$j];
}
for ($j = $pos; $j < strlen($str); $j++) {
$laststr .= $str[$j];
}
return $startstr . $substr . $laststr;
}
$str = "1234567890";
$sstr = "new_word";
echo str_insert($str, 5, $sstr); // 輸出:12345new_word67890
?>
缺點: 效率低、代碼冗長、不支援多字節字符(中文會亂碼)。
<?php
function str_insert2($str, $pos, $substr) {
$start = substr($str, 0, $pos);
$end = substr($str, $pos);
return $start . $substr . $end;
// 一行版:return substr($str, 0, $pos) . $substr . substr($str, $pos);
}
$str = "1234567890";
$sstr = "new_word";
echo str_insert2($str, 5, $sstr); // 輸出:12345new_word67890
?>
優點: 代碼簡潔、效率高、語義清晰。
注意: substr() 按字節操作,中文環境請使用 mb_substr()。
<?php $str = "1234567890"; $sstr = "new_word"; // 第 4 參數 0 表示不替換任何字符,僅插入 echo substr_replace($str, $sstr, 5, 0); // 輸出:12345new_word67890 ?>
函數簽名: substr_replace(string $string, string $replace, int $offset, int $length = 0)
$offset:插入位置(0 為開頭,負數從末尾計算)$length:替換長度,0 表示純插入不替換<?php
function mb_str_insert($str, $pos, $substr, $encoding = 'UTF-8') {
// 使用 mb_substr 確保中文不截斷
return mb_substr($str, 0, $pos, $encoding)
. $substr
. mb_substr($str, $pos, null, $encoding);
}
// 測試中文
$str = "你好世界";
echo mb_str_insert($str, 2, "美好的"); // 輸出:你好美好的世界
?>
<?php
$str = str_repeat('a', 10000);
$insert = 'TEST';
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) str_insert($str, 5000, $insert);
echo "遍歷法: " . (microtime(true) - $start) . "s\n";
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) str_insert2($str, 5000, $insert);
echo "substr法: " . (microtime(true) - $start) . "s\n";
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) substr_replace($str, $insert, 5000, 0);
echo "substr_replace法: " . (microtime(true) - $start) . "s\n";
// 典型輸出:
// 遍歷法: 2.45s
// substr法: 0.12s
// substr_replace法: 0.08s
?>
| 方法 | 性能 | 可讀性 | 中文支援 | 推薦場景 |
|---|---|---|---|---|
| 遍歷重組 | 極低 | 低 | 不支援 | 教學演示 |
| substr 拼接 | 高 | 高 | 需 mb_substr | 通用項目 |
| substr_replace | 最高 | 最高 | 需 mb_ 版本 | 生產環境首選 |
更多字符串操作技巧,請參考:《PHP 字符串(string)用法總結》、《PHP 正則表達式用法總結》、《PHP 多字節字符串處理指南》等專題。