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

PHP 字串處理核心函數大全:addcslashes、addslashes、chunk_split 等實戰詳解

     編輯:PHP 相關知識

PHP 字串處理核心函數大全:實戰詳解與常見陷阱

字串操作是 PHP 開發最高頻任務,掌握核心函數行為差異、編碼影響與安全陷阱,能避免大量難以排查的 Bug。本文系統整理 10 大常用字串函數,附代碼範例與最佳實踐。

1. addcslashes() - 指定字元範圍加反斜線

<?php
// 將 ASCII 在 'A' 到 'z' 之間的字元全部轉義
echo addcslashes('foo[ ]', 'A..z');  
// 輸出:\f\o\o\[ \]  (f,o,o,[,] 都在 A-z 範圍內)

// 範圍必須從小到大:'A..z' 正確,'z..A' 錯誤
// addcslashes('foo[ ]', 'z..A'); // 輸出異常
?>

用途:準備資料寫入特定格式(如資料庫匯出、Shell 指令參數),精確控制哪些字元需轉義。

2. stripcslashes() - 移除 addcslashes 新增的反斜線

<?php
$str = '\\\\\\\\';  // 實際字串:\\\\
echo stripcslashes($str);  // 輸出:\\  (四個轉義字元還原為兩個)
?>

3. addslashes() - 預定義字元轉義(受 magic_quotes_sybase 影響)

<?php
$str = "\\'\"\\";  // 包含單引號、雙引號、反斜線

// magic_quotes_sybase = Off (預設)
echo addslashes($str);  // 輸出:\'\"\\\\

// magic_quotes_sybase = On
// 單引號以雙單引號轉義,而非反斜線
ini_set('magic_quotes_sybase', 'On');
echo addslashes($str);  // 輸出:''"\\
?>

⚠️ 重大警示:magic_quotes_sybase 已在 PHP 5.4 移除,**切勿依賴此設定**。資料庫操作請改用 **Prepared Statements (PDO/MySQLi)**,完全避免手動轉義。

4. stripslashes() - 移除 addslashes 新增的反斜線

<?php
// magic_quotes_sybase = Off
$str = "\\'\"\\\\";
echo stripslashes($str);  // 輸出:\'"\

// magic_quotes_sybase = On
$str = "''";
echo stripslashes($str);  // 輸出:'
?>

5. chop() / rtrim() - 移除右側指定字元

<?php
var_dump(chop(' 123 '));        // string(4) " 123"  (預設移除空白)
var_dump(chop(' 123 c', 'c'));  // string(5) " 123 "
var_dump(chop(' 123 asw', 'swa')); // string(5) " 123 "
?>

注意:chop 是 rtrim 別名,第二參數為**字元列表**(非子字串),列表中任一字元出現在末尾都會被移除。

6. chr() - ASCII 碼轉字元

<?php
echo chr(97);  // 輸出:a
echo chr(65);  // 輸出:A
?>

7. chunk_split() - 字串分塊插入分隔符

<?php
// Base64 編碼輸出符合 RFC 2045(每 76 字元換行)
$encoded = base64_encode('大量二進位資料...');
$formatted = chunk_split($encoded);  // 預設 76 字元 + \r\n

// 自訂長度與分隔符
echo chunk_split('1234567890', 3, '-');  // 123-456-789-0-
?>

應用:郵件附件編碼、長字串格式化顯示、生成固定寬度文字報表。

8. count_chars() - 字元頻率統計

<?php
$str = "Hello World!";
print_r(count_chars($str, 0));  // 模式 0:所有字元(0-255)出現次數陣列
print_r(count_chars($str, 1));  // 模式 1:僅列出出現過的字元
print_r(count_chars($str, 3));  // 模式 3:回傳所有使用過的字元組成的字串
// 輸出:" !HWdelor"
?>

模式對照:0=完整頻率表、1=非零頻率、2=零頻率、3=已用字元字串、4=未用字元字串。

9. 關鍵補充:多位元組字串函數 (mbstring)

上述函數多為**單位元組**操作,處理中文等 UTF-8 字串會產生錯誤結果。必須使用 mb_* 對應函數:

單位元組多位元組 (需啟用 mbstring)說明
strlen()mb_strlen()字串長度(字元數 vs 位元組數)
substr()mb_substr()截取子字串
strpos()mb_strpos()查找位置
strtolower()mb_strtolower()大小寫轉換
preg_*preg_* (加 u 修飾符)正則需加 /u 處理 UTF-8
<?php
$str = '中文';
echo strlen($str);      // 6 (位元組數,UTF-8 每中文 3 字節)
echo mb_strlen($str, 'UTF-8');  // 2 (字元數)
?>

10. 字串比較陷阱

<?php
// 嚴格比較
var_dump('123' == '123');   // true
var_dump('123' === '123');  // true
var_dump('123' == 123);     // true (型別轉換)
var_dump('123' === 123);    // false (型別不同)

// 自然順序比較 (處理數字字串)
var_dump(strnatcmp('img2.png', 'img10.png'));  // -1 (正確:2 < 10)
var_dump(strcmp('img2.png', 'img10.png'));     // 1  (錯誤:字典序 '2' > '1')
?>

最佳實踐總結

  1. 資料庫查詢:永遠使用 Prepared Statements,拒絕手動 addslashes
  2. 中文處理:全程使用 mb_* 函數,確保 php.ini 啟用 extension=mbstring
  3. 輸出安全:HTML 輸出用 htmlspecialchars(),JS 輸出用 json_encode(),Shell 參數用 escapeshellarg()
  4. 編碼一致:檔案儲存、資料庫連線、HTML meta、PHP 內部編碼統一 UTF-8
  5. 效能考量:單位元組操作比多位元組快,純 ASCII 場景優先用原生函數

字串處理看似基礎,實則暗藏編碼、安全、效能等多重挑戰。建立正確函數選擇習慣,是資深 PHPer 的基本功。

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