| 標準函數 | 多位元組版本 |
strlen | mb_strlen |
substr | mb_substr |
strpos | mb_strpos |
strtolower | mb_strtolower |
strtoupper | mb_strtoupper |
substr_count | mb_substr_count |
str_split | mb_str_split (PHP 7.4+) |
ereg/eregi | mb_ereg/mb_eregi (已棄用) |
實戰常用模式
1. 安全輸出 HTML (防 XSS)
function h($str) {
return htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
echo "<div>" . h($userInput) . "</div>";
2. 產生 URL 友善 slug
function slugify($str) {
$str = mb_strtolower(trim($str), 'UTF-8');
$str = preg_replace('/[^\p{L}\p{N}\s-]/u', '', $str); // 保留字母數字空格連字號
$str = preg_replace('/[\s-]+/', '-', $str); // 空格連字號合併
return trim($str, '-');
}
3. 截取 UTF-8 字串不斷字
function mb_truncate($str, $length, $suffix = '...') {
if (mb_strlen($str) <= $length) return $str;
return mb_substr($str, 0, $length - mb_strlen($suffix)) . $suffix;
}
4. 高效能字元對應替換 (strtr vs str_replace)
$map = ['&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => '''];
// 單字元/固定字串映射:strtr 最快 (O(n))
$escaped = strtr($html, $map);
// 複雜模式:str_replace
$escaped = str_replace(array_keys($map), array_values($map), $html);
5. CSV 匯出 (標準 RFC 4180)
function exportCsv($rows, $filename = 'export.csv') {
header('Content-Type: text/csv; charset=UTF-8');
header("Content-Disposition: attachment; filename=\"$filename\"");
header('Pragma: no-cache');
$out = fopen('php://output', 'w');
// UTF-8 BOM 讓 Excel 正確識別
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($rows as $row) {
fputcsv($out, $row);
}
fclose($out);
}
效能優化關鍵點
| 場景 | 推薦函數 | 避免 |
| 單字元/固定字串批量替換 | strtr (單次掃描) | 多次 str_replace、preg_replace |
| 檢查字串開頭/結尾 | str_starts_with/str_ends_with (PHP 8+) | substr($str,0,3)==='foo' |
| 包含檢查 | str_contains (PHP 8+) | strpos(...) !== false |
| 大量字串連接 | 陣列收集後 implode | 迴圈中 .= |
| 正則重複使用 | 預編譯模式、快取 | 迴圈中重複 preg_* |
| UTF-8 字串長度/截取 | mb_strlen/mb_substr | strlen/substr (會斷字) |
常見陷阱
- 字串索引存取:
$str[0] 回傳位元組,非字元。UTF-8 用 mb_substr($str,0,1)
- strlen vs mb_strlen:前者回傳位元組數,後者回傳字元數
- strpos 回傳 0 視為 false:必須用
=== false 或 !== false 判斷
- htmlspecialchars 預設不編碼單引號:需加
ENT_QUOTES
- number_format 浮點精度:大數字用
bcmath 或 gmp
- money_format 已移除 (PHP 8.0):改用
NumberFormatter (intl)
總結
PHP 字串函數庫極其豐富,掌握分類體系、多位元組處理原則、效能特性與現代 API (PHP 8+ str_contains, str_starts_with, str_ends_with),能編寫高效、安全、正確的字串處理代碼。核心原則:UTF-8 一律用 mb_*,單字元映射用 strtr,正則最後手段,輸出必經 htmlspecialchars。
- 上一篇文章: PHP XML 解析器完全指南:Expat 事件驅動解析、核心函數與實戰模式
- 下一篇文章: PHP SimpleXML 函數完整指南
Copyright ©
程式碼之家 All Rights Reserved