爬蟲資料、用戶輸入、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);
}
| 碼位 | 符號 | 名稱 | 處理 |
|---|---|---|---|
| 0x00 | NUL | 空字元 | 移除 |
| 0x09 | HT | 水平製表 | → 空格 |
| 0x0A | LF | 換行 | → 空格 |
| 0x0D | CR | 回車 | → 空格 |
| 0x20 | SP | 空格 | 保留 |
| 0x7F | DEL | 刪除 | 移除 |
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 不允許任何控制字元(含 Tab/LF/CR 需實體化)
$xmlSafe = htmlspecialchars(filter_ascii_control($input), ENT_XML1, 'UTF-8');
// JSON 允許 Unicode,但控制字元需跳脫(json_encode 自動處理)
$jsonSafe = json_encode(filter_ascii_control($input));