常見需求:移除字串開頭的 akmumu/ 與結尾的 .json。直接用 ltrim/rtrim 會因「字元列表」語意導致錯誤刪除,本文說明正確姿勢。
$str = 'akmumu/writedb.json';
$str = ltrim($str, 'akmumu/'); // 危險!
$str = rtrim($str, '.json'); // 危險!
// 結果:/writedb (ltrim 刪除了所有 a,k,m,u,/, 字元;rtrim 刪除了所有 .,j,s,o,n 字元)
原因: trim($str, $charlist) 的第二參數是**字元集合**,而非子字串。會刪除所有出現在列表中的字元,直到遇到不在列表中的字元為止。
$str = 'akmumu/writedb.json';
// 刪除開頭固定前綴
$prefix = 'akmumu/';
if (strpos($str, $prefix) === 0) {
$str = substr($str, strlen($prefix));
}
// 刪除結尾固定後綴
$suffix = '.json';
$suffixLen = strlen($suffix);
if (substr($str, -$suffixLen) === $suffix) {
$str = substr_replace($str, '', -$suffixLen);
}
// 結果:writedb
function remove_prefix($str, $prefix) {
return (strpos($str, $prefix) === 0) ? substr($str, strlen($prefix)) : $str;
}
function remove_suffix($str, $suffix) {
$len = strlen($suffix);
return ($len > 0 && substr($str, -$len) === $suffix) ? substr_replace($str, '', -$len) : $str;
}
// 使用
$str = remove_suffix(remove_prefix($str, 'akmumu/'), '.json');
$str = preg_replace('/^akmumu\//', '', $str); // ^ 鎖定開頭
$str = preg_replace('/\.json$/', '', $str); // $ 鎖定結尾
trim/ltrim/rtrim 只適合刪除**單一字元集合**(如空白字元 " \t\n\r\0\x0B")。substr/substr_replace 或正則錨點 ^/$。掌握字串處理函數的真實語意,能避免 90% 的「莫名其妙被過度截斷」Bug。