字串操作是 PHP 開發最高頻任務,掌握核心函數行為差異、編碼影響與安全陷阱,能避免大量難以排查的 Bug。本文系統整理 10 大常用字串函數,附代碼範例與最佳實踐。
<?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 指令參數),精確控制哪些字元需轉義。
<?php $str = '\\\\\\\\'; // 實際字串:\\\\ echo stripcslashes($str); // 輸出:\\ (四個轉義字元還原為兩個) ?>
<?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)**,完全避免手動轉義。
<?php // magic_quotes_sybase = Off $str = "\\'\"\\\\"; echo stripslashes($str); // 輸出:\'"\ // magic_quotes_sybase = On $str = "''"; echo stripslashes($str); // 輸出:' ?>
<?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 別名,第二參數為**字元列表**(非子字串),列表中任一字元出現在末尾都會被移除。
<?php echo chr(97); // 輸出:a echo chr(65); // 輸出:A ?>
<?php
// Base64 編碼輸出符合 RFC 2045(每 76 字元換行)
$encoded = base64_encode('大量二進位資料...');
$formatted = chunk_split($encoded); // 預設 76 字元 + \r\n
// 自訂長度與分隔符
echo chunk_split('1234567890', 3, '-'); // 123-456-789-0-
?>
應用:郵件附件編碼、長字串格式化顯示、生成固定寬度文字報表。
<?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=未用字元字串。
上述函數多為**單位元組**操作,處理中文等 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 (字元數) ?>
<?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')
?>
addslashesmb_* 函數,確保 php.ini 啟用 extension=mbstringhtmlspecialchars(),JS 輸出用 json_encode(),Shell 參數用 escapeshellarg()字串處理看似基礎,實則暗藏編碼、安全、效能等多重挑戰。建立正確函數選擇習慣,是資深 PHPer 的基本功。