mt:Var name="data" regex_replace="/[^\n]/g","" count_characters="1" setvar="length"
区切り文字(今回は\n)以外を消して、残った文字を数えれば要素数。
変化の流れ abc[\n]def[\n]ghi[\n] → [\n][\n][\n] → 3つ → 変数lengthに3を入れる
※参考サイトは末尾に,がないためcat=","で一つ付け加えてますが、今回は末尾に\nがあるのでcat="\n"は不要です
mt:Var name="data" regex_replace="/^([^\n]+).*/s","$1" setvar="value" mt:Var name="data" regex_replace="/^([^\n]+\n?)(.*)/s","$2" setvar="data"
s修飾子を付けることで.に改行コードを含めるように指示します。
s修飾子が無い場合は改行コードでちょん切れてしまいます。
環境がなくて動かせてないのですが、要点だけ回答させてもらいました。
????以降追記
ループ1回目
mt:Var name="data" regex_replace="/^([^\n]+).*/s","$1" setvar="value"
"/^([^\n]+).*/s"に"abc[\n]def[\n]ghi[\n]"が与えられると次の二つのパーツに切り分けられます。
^[^\n]+ | 先頭から続く\n以外の文字列 | abc |
.* | 後続の文字列 | [\n]def[\n]ghi[\n] |
(かっこ)で囲まれている部分は後ろの処理で使えるように記憶され、
(かっこ)の登場順に$1,$2…で利用することができます。
かっこは([^\n]+)の一組だけなので$1にはabcが入ります。
流れとしては"abc[\n]def[\n]ghi[\n]"を"abc"に置き換えた後、変数valueに格納となります。
mt:Var name="data" regex_replace="/^([^\n]+\n?)(.*)/s","$2" setvar="data"
"/^([^\n]+\n?)(.*)/s"に"abc[\n]def[\n]ghi[\n]"が与えられると次の二つのパーツに切り分けられます。
^[^\n]+\n? | 先頭から最初に出てくる\nまでの文字列 | abc\n |
.* | 後続の文字列 | def[\n]ghi[\n] |
(かっこ)は二組あるので順に"abc\n"が$1、"def[\n]ghi[\n]"が$2に入ります。
流れとしては"abc[\n]def[\n]ghi[\n]"を"def[\n]ghi[\n]"に置き換えた後、変数dataに格納となります。
これが繰り返されることによりループの中で徐々に変数dataが削られていく形になり最後には空になります。
ループ2回目
mt:Var name="data" regex_replace="/^([^\n]+).*/s","$1" setvar="value"
"def[\n]ghi[\n]" → 変数value="def"
mt:Var name="data" regex_replace="/^([^\n]+\n?)(.*)/s","$2" setvar="data"
"def[\n]ghi[\n]" → 変数data="ghi[\n]"
ループ3回目
mt:Var name="data" regex_replace="/^([^\n]+).*/s","$1" setvar="value"
"ghi[\n]" → 変数value="ghi"
mt:Var name="data" regex_replace="/^([^\n]+\n?)(.*)/s","$2" setvar="data"
"ghi[\n]" → 変数data=""