首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 過濾字串所有空白字元:空格、全形空白、換行、Tab 完整移除

     編輯:PHP 綜合知識

PHP 內建 trim() 只能移除字串首尾空白,若需移除字串所有位置的空白字元(半形/全形空格、換行、Tab、垂直定位符等),需自行實作。

基本實作:str_replace 陣列對應

<?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 行 全形空格
?>

\s 匹配字元完整列表

字元十六進位說明
空格0x20半形空格
\t0x09水平定位符 (Tab)
\n0x0A換行 (LF)
\r0x0D回車 (CR)
\v0x0B垂直定位符
\f0x0C換頁
 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 陣列版本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved