函式定義
string addcslashes(string $string, string $charlist)
string stripcslashes(string $string)
addcslashes:在 $charlist 指定的每個字元前加上反斜線 \。支援範圍寫法 'a..z'、'0..9'。
stripcslashes:移除 addcslashes 加入的反斜線,還原字串。
- 不同於
addslashes(固定轉義 ' " \ NULL),addcslashes 可自訂目標字元集。
核心參數:charlist 寫法
| 寫法 | 含義 | 範例 |
'A' | 單一字元 | addcslashes($str, 'A') |
'A..Z' | ASCII 範圍 | 大寫字母全部轉義 |
'\0..\37' | 八進位碼範圍 | 控制字元轉義 |
'\n\r\t' | 多個字元 | 換行、回車、定位 |
注意:charlist 中的 ^、-、] 有特殊含義,需轉義或放在開頭/結尾。
實戰場景:SQL 字串安全插入
原文案例:MySQL TEXT 欄位插入含單引號內容失敗,解決方案:
$sql = "UPDATE book SET bookname='let's go' WHERE bookid=1";
// 單引號導致 SQL 語法錯誤
// 針對單引號轉義
$safeSql = addcslashes($sql, "'");
echo $safeSql;
// UPDATE book SET bookname=\'let\'s go\' WHERE bookid=1
// 執行後資料庫實際儲存:let's go
// 讀出時還原(若需)
$original = stripcslashes($safeSql);
addcslashes vs addslashes 差異
| 特性 | addslashes | addcslashes |
| 轉義目標 | 固定:' " \ NULL | 自訂 charlist |
| 適用場景 | 通用字串安全、資料庫舊版驅動 | 特定字元集、二進位協議、自訂轉義規則 |
| 效能 | 略快 | 需解析 charlist |
| 還原函式 | stripslashes | stripcslashes |
進階用法:JavaScript 字串安全輸出
$jsVar = "alert('Hello \"World\"');";
// 需轉義單引號、雙引號、反斜線、換行
$safeJs = addcslashes($jsVar, "'\"\\\n\r");
/* 結果:
alert(\'Hello \"World\"\\');
可直接內嵌於 ";
常見錯誤
- 重複轉義:對已轉義字串再次呼叫
addcslashes 會產生 \\。務必確認輸入是否已處理。
- charlist 範圍寫錯:
'a-z' 不會展開,必須寫 'a..z'(兩點)。
- 二進位資料損壞:
stripcslashes 假設反斜線皆為轉義用途,若原始資料含有真實 \ 後接非轉義字元,可能誤刪。二進位協議建議用 bin2hex/base64 編碼。
現代替代方案
- 資料庫操作 → 預備語句 (Prepared Statements),完全避免手動轉義。
- HTML 輸出 →
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')。
- JavaScript 內嵌 →
json_encode($str)(自動處理所有需轉義字元,含 Unicode)。
- Shell 指令 →
escapeshellarg / escapeshellcmd。
- 上一篇文章: PHP substr() 函式字串截取完整指南:參數、負索引、多位元組陷阱與最佳實務
- 下一篇文章: PHP Swoole 實現 WebSocket 即時資料推送:從輪詢到長連接的架構升級
Copyright ©
程式碼之家 All Rights Reserved