統計字符串中大小寫字母數量、驗證密碼複雜度、解析特定格式代碼等,均需判斷字符大小寫。本文介紹三種不同思路的實現。
使用 preg_match 檢測字符串是否全為大寫/小寫字母。
<?php
function checkCaseRegex($str) {
if (preg_match('/^[a-z]+$/', $str)) {
return '全小寫字母';
} elseif (preg_match('/^[A-Z]+$/', $str)) {
return '全大寫字母';
} elseif (preg_match('/^[a-zA-Z]+$/', $str)) {
return '混合大小寫字母';
} else {
return '包含非字母字符';
}
}
echo checkCaseRegex('hello'); // 全小寫字母
echo checkCaseRegex('WORLD'); // 全大寫字母
echo checkCaseRegex('Hello'); // 混合大小寫字母
echo checkCaseRegex('Hi123'); // 包含非字母字符
?>
缺點: 僅能判斷整體屬性,無法逐字符統計。
利用 ord() 獲取 ASCII 值:大寫 A-Z (65-90),小寫 a-z (97-122)。
<?php
function checkCaseAscii($char) {
$ascii = ord($char);
if ($ascii >= 65 && $ascii <= 90) return '大寫字母';
if ($ascii >= 97 && $ascii <= 122) return '小寫字母';
return '非字母';
}
// 統計字符串中大小寫數量
function countCase($str) {
$upper = $lower = 0;
for ($i = 0; $i < strlen($str); $i++) {
$c = $str[$i];
if (ord($c) >= 65 && ord($c) <= 90) $upper++;
elseif (ord($c) >= 97 && ord($c) <= 122) $lower++;
}
return ['upper' => $upper, 'lower' => $lower];
}
print_r(countCase('Hello World')); // Array ( [upper] => 2 [lower] => 8 )
?>
使用 strtoupper() / strtolower() 與原字符比較。
<?php
function checkCaseBuiltin($char) {
if ($char === strtoupper($char) && $char !== strtolower($char)) return '大寫字母';
if ($char === strtolower($char) && $char !== strtoupper($char)) return '小寫字母';
return '非字母或非字母字符';
}
// 批量檢測
$str = 'PHP 8.2';
for ($i = 0; $i < strlen($str); $i++) {
echo $str[$i] . ' => ' . checkCaseBuiltin($str[$i]) . "\n";
}
/*
P => 大寫字母
H => 大寫字母
P => 大寫字母
=> 非字母或非字母字符
8 => 非字母或非字母字符
. => 非字母或非字母字符
2 => 非字母或非字母字符
*/
?>
| 方法 | 性能 | 適用場景 |
|---|---|---|
| 正則 | 較慢 | 整體格式驗證(如用戶名規則) |
| ASCII | 最快 | 大量字符逐個統計、底層解析 |
| 內置函數 | 中等 | 代碼可讀性優先、多字節字符兼容性較好 |
根據具體需求選擇:整體驗證用正則,高性能統計用 ASCII,通用邏輯用內置函數。注意多字節字符(中文等)需配合 mb_ 系列函數處理。