PHP 內建 trim() 只能移除字串首尾空白,若需移除字串所有位置的空白字元(半形/全形空格、換行、Tab、垂直定位符等),需自行實作。
<?php
function myTrim($str) {
$search = [
" ", // 半形空格
" ", // 全形空格 (U+3000)
"\n", // 換行 (LF)
"\r", // 回車 (CR)
"\t", // Tab
"\v", // 垂直定位符
"\f", // 換頁
"\0", // Null 字元
];
$replace = ['', '', '', '', '', '', '', ''];
return str_replace($search, $replace, $str);
}
// 測試
$str = "jkgsd gsgsdgs\ngsdg\tsd";
echo myTrim($str); // 輸出: jkgsdgsgsdgsgsdgsd
?>
<?php
function trimAll($str) {
// \s 匹配所有空白字元:空格、Tab、換行、回車、垂直定位符、換頁
// u 修飾符支援 UTF-8(含全形空格 U+3000)
return preg_replace('/\s+/u', '', $str);
}
// 保留單一空格版本(將連續空白壓縮為單一空格)
function normalizeWhitespace($str) {
return preg_replace('/\s+/u', ' ', $str);
}
// 測試
$str = "第 1 行\n第 2 行\r\n第\t3\t行 全形空格";
echo trimAll($str); // 第1行第2行第3行全形空格
echo normalizeWhitespace($str); // 第 1 行 第 2 行 第 3 行 全形空格
?>
| 字元 | 十六進位 | 說明 |
|---|---|---|
| 空格 | 0x20 | 半形空格 |
| \t | 0x09 | 水平定位符 (Tab) |
| \n | 0x0A | 換行 (LF) |
| \r | 0x0D | 回車 (CR) |
| \v | 0x0B | 垂直定位符 |
| \f | 0x0C | 換頁 |
| 0x3000 | 全形空格 (需 /u 修飾符) | |
| 其他 Unicode 空白 | 各式 | 如 U+2000~U+200A 等(/u 可匹配) |
<?php
$str = str_repeat("a b\tc\nd\r e f\v", 10000); // ~140KB 測試字串
$start = microtime(true);
for ($i = 0; $i < 100; $i++) trimAll($str);
echo "preg_replace: " . (microtime(true) - $start) . "s\n";
$start = microtime(true);
for ($i = 0; $i < 100; $i++) myTrim($str);
echo "str_replace: " . (microtime(true) - $start) . "s\n";
/*
典型輸出:
preg_replace: 0.042s
str_replace: 0.018s
*/
?>
str_replace 陣列版本通常比正則快 2-3 倍,但正則版本更簡潔且涵蓋面更廣(含所有 Unicode 空白字元)。
<?php
function mb_trim_all($str, $encoding = 'UTF-8') {
// 使用 mb_ereg_replace 確保多位元組安全
return mb_ereg_replace('\s+', '', $str, 'u');
}
// 若需保留字串內的單一空格但移除首尾與多餘空白
function mb_normalize_whitespace($str, $encoding = 'UTF-8') {
$str = mb_ereg_replace('^\s+|\s+$', '', $str, 'u'); // trim 首尾
return mb_ereg_replace('\s+', ' ', $str, 'u'); // 壓縮中間
}
?>
<?php
// 1. 清理使用者輸入的手機號碼
$phone = trimAll($_POST['phone']); // "09 12-345 678" → "0912345678"
// 2. 比對身分證字號(忽略空白)
$id1 = trimAll('A 123 456 789');
$id2 = trimAll('A123456789');
var_dump($id1 === $id2); // true
// 3. 產生 URL 友善 slug(先正規化空白再處理)
function toSlug($str) {
$str = normalizeWhitespace($str);
$str = mb_strtolower($str, 'UTF-8');
$str = preg_replace('/[^\p{L}\p{N}\s-]/u', '', $str); // 保留字母、數字、空格、連字號
$str = preg_replace('/\s+/', '-', $str);
return trim($str, '-');
}
echo toSlug(" Hello World ! "); // hello-world
?>
總結:一般情況用 preg_replace('/\s+/u', '', $str) 最簡潔完整;極度在意效能或特定字元集時用 str_replace 陣列版本。