以下の規則で作られた文字列があります。
・ '[' , ']' によって入れ子に、もしくは並列に分けられます。
・'['のすぐ後には必ず大文字のアルファベットのみで構成される単語が付きます。これがtypeデータになります。
・typeデータの後にstrデータが続きます。typeデータとstrデータは必ず半角スペースで区切られます。
・strデータ内に '[' , ']' が含まれることはありません。strデータ内に'[' , ']'以外の記号(大文字小文字の英数字、カナ漢字、他の記号)が含まれることはあります。
・strデータが存在する入れ子の「深さ」をrankデータと定義します。あるstrデータの前にある '[' の数 と ']'の数 の差は、rankと等しいです。
たとえば、[A inu [B neko nyan [A tori] [AB kizi]] [B musi kabuto musi [CB taka]]]のような文字列です。
この文字列を解析して、CSVデータを作成する関数を作成したいです。
たとえば
[A inu [B neko nyan [A tori] [AB kizi]] [B musi kabuto musi [CB taka]]]
という文字列を解析すると、
rank,type,str
1,A , inu
2,B , neko nyan
3,A , tori
3,AB ,kizi
2,B , musi kabuto musi
3,CB ,taka
というCSVデータが作成されます。
このような動作を行う関数を教えてください。
自分でも文字列を一文字ずつ読み込んで、ifとpreg_matchで文字を判別しながら動作するものを作りましたが、圧倒的に遅いです。
array_walk_recursiveなどをうまく使えば高速に処理できるのかもしれませんが、自分では思いつきませんでした。
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/19 11:44