萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP rtrim() 陷阱:字元清單而非字串尾綴刪除

現象重現

echo rtrim('<p></div>', '</div>'); // 輸出: <p
echo ltrim('www.jb51.net', 'www.');    // 輸出: jb51.net

預期第一行輸出 <p>,第二行輸出 jb51.net,實際卻不同。原因在於 rtrim/ltrim/trim 的第二參數是字元清單,而非字串尾綴。

官方文件說明

「你可以透過 charlist 參數指定要移除的字元,列出所有要移除的字元。使用 .. 可指定字元範圍。」

逐步分析

rtrim('<p></div>', '</div>') 從右向左掃描:

  1. 遇到 > —— 在清單 </div> 中(包含 >),移除。
  2. 遇到 v —— 在清單中,移除。
  3. 遇到 i —— 在清單中,移除。
  4. 遇到 d —— 在清單中,移除。
  5. 遇到 / —— 在清單中,移除。
  6. 遇到 < —— 在清單中,移除。
  7. 遇到 > —— 在清單中,移除。
  8. 遇到 p —— 不在清單中,停止。

結果剩下 <p。

正確做法

若要移除確切尾綴,請用 substr 或正則:

$str = '<p></div>';
$suffix = '</div>';
if (substr($str, -strlen($suffix)) === $suffix) {
    $str = substr($str, 0, -strlen($suffix));
}
echo $str; // <p>

總結

  • trim 系列函式的 $charlist 是獨立字元集合,順序無關。
  • 不要用它來移除多字元子字串。
  • 需要移除特定前綴/尾綴時,使用 substr、strpos、preg_replace 或 PHP 8.0+ 的 str_starts_with/str_ends_with。
copyright © 萬盛學電腦網 all rights reserved