<?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
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/BsoTs
function name: (null)
number of ops: 33
compiled vars: !0 = $delimiter, !1 = $value
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
4 0 E > ASSIGN !0, '_'
5 1 ASSIGN !1, '++Convert+a++string+to+snake++case.++AA%E3%80%80'
10 2 INIT_FCALL 'ucwords'
3 SEND_VAR !1
4 DO_ICALL $4
5 ASSIGN !1, $4
11 6 CONCAT ~6 !1, '%0A'
7 ECHO ~6
17 8 INIT_FCALL 'preg_replace'
9 SEND_VAL '%2F%5Cs%2B%2Fu'
10 SEND_VAL ''
11 SEND_VAR !1
12 DO_ICALL $7
13 ASSIGN !1, $7
18 14 CONCAT ~9 !1, '%0A'
15 ECHO ~9
22 16 INIT_FCALL 'preg_replace'
17 SEND_VAL '%2F%28.%29%28%3F%3D%5BA-Z%5D%29%2Fu'
18 CONCAT ~10 '%241', !0
19 SEND_VAL ~10
20 SEND_VAR !1
21 DO_ICALL $11
22 ASSIGN !1, $11
23 23 CONCAT ~13 !1, '%0A'
24 ECHO ~13
26 25 INIT_FCALL 'mb_strtolower'
26 SEND_VAR !1
27 SEND_VAL 'UTF-8'
28 DO_ICALL $14
29 ASSIGN !1, $14
27 30 CONCAT ~16 !1, '%0A'
31 ECHO ~16
32 > RETURN 1
Generated using Vulcan Logic Dumper, using php 8.0.0
preferences:
136.17 ms | 1001 KiB | 16 Q