php刪除字符串兩邊的空白符:trim()、ltrim()、rtrim()


php刪除字符串兩邊的空白符:trim()、ltrim()、rtrim()

1. 基本概念

在現實中的很多情況下,我們都需要先清除一個字符串左右兩邊的空白字符,然後再使用它。比如我們要求用戶在網頁中的一個輸入框中輸入他的手機號,當用戶輸入的字符串被提交到服務端後,我們需要驗證它是否符合正確的手機號格式。但是用戶可能在手機號的左邊或右邊不小心輸入了空格;為了更好的用戶體驗,我們在服務端先自動清除該字符串左右兩邊的空格再進行格式匹配,而不是直接告訴用戶他的輸入是錯誤的。

php已經為我們提供了實現這一功能的函數,那就是trim()函數。英文單詞trim有“修剪、切除”的意思,在這裡要表達的就是在字符串的左右兩邊進行刪除。trim()函數不但能刪除空白符,還可以刪除其它任意字符,只要你在它的第二個參數中指明瞭你想要刪除的那些字符即可。

還有兩個和trim()函數很相近的函數,ltrim()和rtrim()。ltrim第一個字母l表示left,即它只刪除字符串左邊的空白符或其它字符。rtrim的第一個字母r表示right,即它只刪除字符串右邊的空白符或其它字符。調用trim()等於同時調用ltrim()和rtrim()。

2. 語法

2.1 函數原型

這三個函數的原型如下所示:

<code>string trim(string $str, string $char_mask=" \\t\\n\\r\\0\\\\x0B");
string ltrim(string $str, string $char_mask=" \\t\\n\\r\\0\\\\x0B");
string rtrim(string $str, string $char_mask=" \\t\\n\\r\\0\\\\x0B");/<code>

2.2 參數

其中$str是待處理的字符串,而$char_mask則指明你想要刪除哪些字符。$char_mask是一個可選的參數,當它被省略的時候,這3個函數都默認刪除以下這些空白符:

" ",空格符(ASCII碼32);

"\\t",製表符(ASCII碼9);

"\\n",換行符(ASCII碼10);

"\\r",回車符(ASCII碼13);

"\\0",空字符(ASCII碼0);

"\\\\x0B",垂直製表符(ASCII碼11)。

在$char_mask參數中,還可以使用..來指定一個字符範圍。比如我想要刪除a至z的所有字符,那麼可以將$char_mask指定為"a..z",而不用將a至z的每一個字符都書寫一遍。

當用..指定一個字符範圍的時候,開始字符一定不能大於結束字符,否則實際指定的是開始字符、英文句點和結束字符這3個字符,而不是一個字符範圍。此外,這種情況還會產生一條E_WARNING級別的錯誤消息。

2.3 返回值

這3個函數都返回一個新的字符串,它等價於在參數$str的左邊或右邊刪除指定字符後的結果,而原本的參數$str則不變。

2.4 算法原理

這3個函數並不是只刪除某一邊的一個字符,如果字符串最左邊或最右邊的多個字符都是待刪除字符,那麼它們都會被刪去。trim()函數的算法原理等價於下面的步驟:

首先,trim()函數從$str的第1個字符向右搜索,直到遇到第1個不是待刪除字符的字符為止;此時,它得到一個只包含待刪除字符的最左子串。

然後,trim()函數再從$str的最後一個字符起向左搜索,直到遇到第1個不是待刪除字符的字符為止;此時,它得到一個只包含待刪除字符的最右子串。

新建一個字符串,它等於在$str上刪除前兩個步驟中的最左子串和最右子串後的剩餘內容;返回該字符串。

ltrim()和rtrim()函數的原理與此類似,只是它們只在字符串的一邊而不是兩邊進行刪除。

3. 示例

3.1 省略$char_mask參數

<code>    /*
* 創建一個字符串,它左右兩邊都包含多個空白符;
* 打印該字符串的原始值,以便和之後進行比較。
*/
$str = " \\tI like orange.\\t ";
var_dump($str);

// 對原字符串調用trim()函數,並打印返回值。
$trimmed = trim($str);
print "\\n";
var_dump($trimmed);

// 再次打印原始字符串,看它是否被改變。
print "\\n";
var_dump($str);
?>/<code>

以上代碼的執行結果如圖1所示,可以看到$str左右兩邊的空白符都被刪除了,但中間的空白符沒有被刪除。trim()函數執行之後,$str並不會被改變,因為函數用一個新字符串返回了在$str兩邊刪除空白符的結果。

php刪除字符串兩邊的空白符:trim()、ltrim()、rtrim()

圖1 省略$char_mask參數的情況

3.2 使用$char_mask參數

我們首先使用$char_mask參數來指明我們想刪除其它的字符而非空白符,然後再通過字符範圍的方式來等價地指定這些字符。

<code>    // 創建一個字符串,它左右兩邊都包含多個待刪除的字符
$str = "afkd The water is clean. dbhej";
var_dump($str);

/*
* 對原字符串調用trim()函數,同時指定要刪除的字符為"abcdefghijk";
* 並打印返回值。
*/
$trimmed1 = trim($str, "abcdefghijk");
print "\\n";
var_dump($trimmed1);

/*
* 對原字符串調用trim()函數,同時指定要刪除的字符為"a..k";
* 並打印返回值。
*/
$trimmed2 = trim($str, "a..k");
print "\\n";
var_dump($trimmed2);

/*
* 對原字符串調用trim()函數,同時指定要刪除的字符為"a..gkijh";
* 並打印返回值。
*/

$trimmed3 = trim($str, "a..gkijh");
print "\\n";
var_dump($trimmed3);
?>/<code>

該示例的執行結果如圖2所示,可以看到緊挨著待刪除字符的空白符現在沒有被刪除,因為此時空白符已不再屬於要刪除的字符。此外"a..k"等價於"abcdefghijk",且字符範圍還可以和直接指明待刪除字符的方式混合使用,比如"a..gkijh"其實也等價於"abcdefghijk"。

php刪除字符串兩邊的空白符:trim()、ltrim()、rtrim()

圖2 用$char_mask參數指定要刪除的字符

我們再來測試一下當指明字符範圍的時候開始字符大於結束字符的情況,下面代碼的執行結果如圖3所示。可以看到有一條錯誤消息指明我們在第10行代碼中所指定的字符範圍是錯誤的;其次"d..a"相當於指定的刪除字符是d、.(英文句點)和a這3個,而非一個字符範圍。

<code>    // 創建一個字符串,它左右兩邊都包含多個待刪除的字符
$str = "a.bcd The water is clean. cad";
var_dump($str);

/*
* 對原字符串調用trim()函數,同時指定要刪除的字符為"d..a";
* 並打印返回值。
*/
$trimmed = trim($str, "d..a");
print "\\n";
var_dump($trimmed);
?>/<code>
php刪除字符串兩邊的空白符:trim()、ltrim()、rtrim()

圖3 錯誤的字符範圍指定方式的結果

3.3 ltrim()和rtrim()

<code>    // 創建一個字符串,它左右兩邊都包含多個待刪除的空白符
$str = " I like orange. ";
var_dump($str);

/*
* 對原字符串調用ltrim()函數,
* 並打印返回值。
*/
$trimmed1 = ltrim($str);
print "\\n";
var_dump($trimmed1);

/*
* 對原字符串調用rtrim()函數,
* 並打印返回值。
*/
$trimmed2 = rtrim($str);
print "\\n";
var_dump($trimmed2);
?>/<code>

以上代碼的執行結果如圖4所示,可以看到ltrim()和rtrim()只是在字符串的左邊或右邊進行刪除。

php刪除字符串兩邊的空白符:trim()、ltrim()、rtrim()

圖4 ltrim()和rtrim()的效果

(完)


分享到:


相關文章: