- Output for 7.4.0 - 7.4.33, 8.0.1 - 8.0.30, 8.1.0 - 8.1.30, 8.2.0 - 8.2.26, 8.3.0 - 8.3.14
- Convert A String To Snake Case. AA ConvertAStringToSnakeCase.AA Convert_A_String_To_Snake_Case._A_A convert_a_string_to_snake_case._a_a
<?php
// 初期値です
$delimiter = '_';
$value = ' Convert a string to snake case. AA ';
// ucwords 関数で文字列の各単語の最初の文字を大文字にしています
// @see https://www.php.net/manual/ja/function.ucwords
// ここで区切られた文字列の頭を全て大文字にすることによって
// 後の処理で"_"を付けずに合体させてしまうことを防いでいます
$value = ucwords($value);
echo $value."\n"; // Convert A String To Snake Case. AA
// 空白を全て詰めます。
// これをしない場合、" _A"の様に謎の空白が残った実行結果になってしまいます。
// この処理はもう一度行う正規表現内にまとめることも可能です。
// おそらく貪欲な探索のループが起こるのを警戒して無難に分離しています。
$value = preg_replace('/\s+/u', '', $value);
echo $value."\n"; // ConvertAStringToSnakeCase.AA
// 先読みの正規表現で大文字が見つかり次第 _{$見つかった大文字} となる様にしています。
// (.) と $1 で大文字以前に何か文字が必要、とすることで最初の大文字の前に"_"が追加されることを防止しています。
$value = preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value);
echo $value."\n";// Convert_A_String_To_Snake_Case._A_A
// 最後に文字列中の大文字を全て小文字に変換してスネークケースとして完成させています。
$value = mb_strtolower($value, 'UTF-8');
echo $value."\n"; // convert_a_string_to_snake_case._a_a