HOWTO · PHP

如何在 PHP 中刪除字串中的最後一個字元

本文介紹瞭如何在 PHP 中刪除字串中的最後一個字元。它包括 rtrim()函式和 substr()函式。探索在 PHP 中操作字串的最佳方法,並透過實用範例和清晰的說明提升您的程式設計技能。

本頁內容

從 PHP 字串末尾移除內容

若要從 PHP 字串末尾移除內容,請根據應移除的內容選擇函式。使用 rtrim() 來去除任意數量屬於指定字元集合的尾端位元組。使用長度為 -1 的 substr() 來保留除最後一個位元組之外的字串。PHP 字串是以位元組為導向的,因此當「字元」指的是完整的 Unicode 字元時,請使用支援多位元組的函式。

使用 rtrim() 移除尾端字元集合

rtrim() 會從字串右側移除字元,只要這些字元屬於它的第二個引數,該引數稱為字元遮罩。遮罩是一組符合條件的字元,而不是必須作為一個完整序列相符的後綴。此函式會持續從該集合中移除位元組,直到遇到不在遮罩中的位元組為止。因此,它可以移除多個不同的尾端字元以及一個字元的重複副本。

對於可能以兩個標點符號之一結尾的值,這個完整範例套用了遮罩 !?:

<?php
$value = "report!?!!";
$clean = rtrim($value, "!?");
echo $clean, PHP_EOL;
report

尾端的驚嘆號和問號都屬於遮罩,因此每個都會從末尾被移除,直到遇到前面的 t 為止。

當規則是「從此集合中移除尾端標點或填充」時,請使用此方法。僅指定應可被移除的字元。例如,遮罩 !?. 允許移除末尾由這三個字元組成的任何序列;它並不表示「移除文字後綴 !?.」。如果字串以遮罩之外的字元結尾,該字元及其之前的所有內容都會保留。空字串仍為空。

使用 substr() 移除最後一個字元

對於目標是精確移除最後一個字元的 ASCII 字串,substr($string, 0, -1) 會保留前綴並省略最後一個位元組。起始偏移量 0 從字串開頭開始。負長度從末尾反向計算,因此 -1 使傳回的部分在末尾前一個位元組處停止。

<?php
$string = "Hello World!";
$withoutLastByte = substr($string, 0, -1);
echo $withoutLastByte, PHP_EOL;
Hello World

此程式碼會省略最後一個位元組,無論它是一個字母、標點符號還是空格;與 rtrim() 不同,它不會檢查該位元組的值。

PHP 字串和 substr() 是以位元組為導向的。在 UTF-8 中,一個顯示字元可能使用多個位元組,因此從以多位元組字元結尾的字串中移除一個位元組,可能會留下不完整的位元組序列,而不是移除一個完整的字元。若要移除一個 Unicode 字元,請在啟用 mbstring 擴充功能時使用 mb_substr($string, 0, -1, 'UTF-8')。當資料不是 UTF-8 時,請選擇與資料相符的編碼。

選擇正確的方法並處理邊界情況

當移除規則指定了一組尾端字元並可能移除其中多個時,請使用 rtrim()。當規則是捨棄固定數量的位元組而不論其值為何時,請使用 substr()。對於純 ASCII 值和一個最後字元,substr($string, 0, -1) 能直接表達此意圖。對於由多個可能字元組成的填充,請為 rtrim() 提供您想要的精確遮罩。

兩個函式都會傳回一個字串;兩者都不會就地更改原始變數。如果後續程式碼需要清理後的值,請指派結果。在選擇方法之前,請考慮輸入是否可能為空、目標字元是否真的存在於末尾,以及資料是否使用多位元組編碼。空字串在任一操作下仍為空,而 rtrim() 會讓不相符的結尾保持不變。substr() 仍會移除一個位元組,而不檢查其含義。

一個實用的規則是,尾端字元集合使用 rtrim(),固定位元組數量使用 substr()。如果在您的應用程式中「字元」指的是完整的 Unicode 碼點,請使用相應的多位元組字串函式,並確保其擴充功能和編碼已設定。這些區別在調整範例時也有幫助:更改遮罩以定義哪些尾端位元組可以被移除,或更改 substr() 的長度以定義應省略多少個位元組。