程式碼規範、資料庫欄位對應、API 參數轉換時,常需將 CamelCase 或 PascalCase 轉為 snake_case。本文提供簡潔函式 cc_format(),逐字元判斷大寫並插入底線轉小寫。
function cc_format($name) {
$temp = [];
for ($i = 0; $i < strlen($name); $i++) {
$ascii = ord($name[$i]);
// A-Z: 65-90
if ($ascii >= 65 && $ascii <= 90) {
$lower = chr($ascii + 32); // 轉小寫
if ($i === 0) {
$temp[] = $lower; // 首字元不加底線
} else {
$temp[] = '_' . $lower;
}
} else {
$temp[] = $name[$i];
}
}
return implode('', $temp);
}
$cases = [
'AppPromoZhongQiu2014ActiveStatusSelector',
'camelCaseExample',
'PascalCaseExample',
'already_snake_case',
'XMLHttpRequest',
'HTML5Parser',
];
foreach ($cases as $c) {
echo "$c → " . cc_format($c) . "\n";
}
/* 輸出:
AppPromoZhongQiu2014ActiveStatusSelector → app_promo_zhong_qiu2014_active_status_selector
camelCaseExample → camel_case_example
PascalCaseExample → pascal_case_example
already_snake_case → already_snake_case
XMLHttpRequest → x_m_l_http_request
HTML5Parser → h_t_m_l5_parser
*/
function toSnakeCase($str) {
// 大寫字母前插入底線,全轉小寫,去除開頭底線
return strtolower(trim(preg_replace('/([A-Z])/', '_$1', $str), '_'));
}
// 測試
echo toSnakeCase('AppPromoZhongQiu2014ActiveStatusSelector');
// app_promo_zhong_qiu2014_active_status_selector
function toSnakeCaseAdvanced($str) {
// 1. 連續大寫視為單詞(如 XML → xml,而非 x_m_l)
$str = preg_replace('/([A-Z]+)([A-Z][a-z])/', '$1_$2', $str);
// 2. 小寫/數字接大寫插入底線
$str = preg_replace('/([a-z0-9])([A-Z])/', '$1_$2', $str);
return strtolower($str);
}
echo toSnakeCaseAdvanced('XMLHttpRequest'); // xml_http_request
echo toSnakeCaseAdvanced('HTML5Parser'); // html5_parser
根據專案命名規範選擇適合的轉換策略,保持代碼風格一致。