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

PHP 過濾 ASCII 控制字元:保留可列印字元與常見空白字元的實用函數

     編輯:PHP 綜合知識

問題背景

爬蟲資料、用戶輸入、API 回傳常夾帶不可見控制字元(0x00-0x1F, 0x7F),導致 XML/JSON 序列化失效、資料庫寫入報錯、前端顯示異常。

過濾函數實作

function filter_ascii_control($string) {
    if (!$string) return '';

    $clean = '';
    $len = strlen($string);
    for ($i = 0; $i < $len; $i++) {
        $ord = ord($string[$i]);

        // 保留:Tab(9)、LF(10)、CR(13) → 轉為單一空格
        if ($ord === 9 || $ord === 10 || $ord === 13) {
            $clean .= ' ';
        }
        // 保留:可列印字元 32-126
        elseif ($ord > 31 && $ord < 127) {
            $clean .= $string[$i];
        }
        // 其他控制字元(含 0x7F DEL、0x00-0x08, 0x0B, 0x0C, 0x0E-0x1F) → 丟棄
    }

    // 合併連續空白
    $clean = preg_replace('/\s+/', ' ', $clean);
    return trim($clean);
}

ASCII 控制字元對照表

碼位符號名稱處理
0x00NUL空字元移除
0x09HT水平製表→ 空格
0x0ALF換行→ 空格
0x0DCR回車→ 空格
0x20SP空格保留
0x7FDEL刪除移除

進階:正則單行版(效能較差但簡潔)

function filter_ascii_control_regex($str) {
    // 移除除 \t\n\r 以外的控制字元
    $str = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $str);
    // 統一空白
    return trim(preg_replace('/\s+/', ' ', $str));
}

應用場景範例

$dirty = "Title\x00with\x0Bcontrol\x1Fchars\nand\ttabs\r\n";
$clean = filter_ascii_control($dirty);
// $clean === "Title with control chars and tabs"

XML/JSON 序列化前置處理

// XML 不允許任何控制字元(含 Tab/LF/CR 需實體化)
$xmlSafe = htmlspecialchars(filter_ascii_control($input), ENT_XML1, 'UTF-8');

// JSON 允許 Unicode,但控制字元需跳脫(json_encode 自動處理)
$jsonSafe = json_encode(filter_ascii_control($input));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved