想要過濾掉換行等字元, 最常用的就是 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 也會過濾掉) ?>
話說,如果是 rtrim('abc.com', 'com') 這類案例,應該是以 substr & concat 或 regexp 比較能適合吧 @@
trim 讓它處理輸入偏差(開頭與結尾的換行)與 padding 就好。如果有縮排考量 (\t) ,trim 用起來會比較麻煩:常見是用 strtok 搭配 array (作為有深度的 stack) 處理縮排需求,再用 trim 移除雜字元;但此時,對於用戶以空白 (%20) 替代 tab 的錯誤排版會產生錯誤結果,要額外處理
這個最佳解法當然是 regex, substr 和 str_replace 都會有誤刪的可能性.
rtrim() 的好處是快又簡單, 但是如果跑兩次的話, 速度跟 regex 差不多, 甚至有時候反而會比 regex 慢一點.
註: 這個是在處理大量的文字資料用得, 所以比較在意速度一點. 🙂
感謝您提供的建議~