PHP trim() 過濾掉重複的字元

想要過濾掉換行等字元, 最常用的就是 trim(), trim() 預設會過濾掉於 "此字串前後" 的 下述字元:

  • " " (ASCII 32 (0x20)), an ordinary space. (空白)
  • "\t" (ASCII 9 (0x09)), a tab.
  • "\n" (ASCII 10 (0x0A)), a new line (line feed). (換行)
  • "\r" (ASCII 13 (0x0D)), a carriage return.
  • "\0" (ASCII 0 (0x00)), the NUL-byte.
  • "\x0B" (ASCII 11 (0x0B)), a vertical tab.

PHP trim() 濾掉重複的字元

除了過濾換行、空白.. 等字元外, 還可以指定要過濾的字元, 指定範圍等~ 例如:

  • trim($foo, '.com');
  • trim($binary, "\x00..\x1F");

使用 rtrim() 遇到的問題

使用 rtrim() 遇到下述問題, 這個是使用上沒看清楚 rtrim() 的說明, 以為 rtrim() 會是過濾掉最後面的字串, 實際上 trim() 做的比預想中的還多~

註1: rtrim() 類同 trim(), 差異在 rtrim() 只有過濾字串最後面的文字.

註2: 下述範例是想把字串最後面的 ".com" 過濾掉, 前二行是遇到的問題, 最下面兩行是把過濾 .com 的拆成兩個步驟來解決.

<?php
$domain = 'abc.com';
echo rtrim($domain, '.com'); // ab

$domain = 'abc.com';
$tmp = rtrim($domain, 'com');  // $tmp = abc. 
echo rtrim($tmp, '.'); // abc
?>

使用 trim() 注意事項

但是 trim() 使用上, 要注意的事情是: php trim 會把 指定的字串, 分割成一個一個字元, 分別過濾掉, 而不是過濾掉 "指定字串".

ex: php trim 會把 .com 變成一個一個字元('.', 'c', 'o', 'm'), 分別過濾掉, 而不是過濾掉 ".com".

所以使用 trim() 要注意下述的事情:

<?php
echo trim('ccmocm.abc.cccmocm', 'com'); // .abc.
echo trim('abc', 'bad'); // c (ab 被濾掉了, 沒有 full match 也會過濾掉)
?>

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈PHP trim() 過濾掉重複的字元〉中有 2 則留言

  1. 話說,如果是 rtrim('abc.com', 'com') 這類案例,應該是以 substr & concat 或 regexp 比較能適合吧 @@

    trim 讓它處理輸入偏差(開頭與結尾的換行)與 padding 就好。如果有縮排考量 (\t) ,trim 用起來會比較麻煩:常見是用 strtok 搭配 array (作為有深度的 stack) 處理縮排需求,再用 trim 移除雜字元;但此時,對於用戶以空白 (%20) 替代 tab 的錯誤排版會產生錯誤結果,要額外處理

    1. 這個最佳解法當然是 regex, substr 和 str_replace 都會有誤刪的可能性.

      rtrim() 的好處是快又簡單, 但是如果跑兩次的話, 速度跟 regex 差不多, 甚至有時候反而會比 regex 慢一點.

      註: 這個是在處理大量的文字資料用得, 所以比較在意速度一點. 🙂

      感謝您提供的建議~

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料