$str = "unlockType BirthdayCake {
// Don't delete
commonName \"Birthday Cake\"
autoTag
category Item
path models/
timedExclusive 1
descSymbol BirthdayCakeDesc
dispSymbol BirthdayCakeDisp
flairCfg \"Cake/Idle.aaf mat_BirthdayCake< /scale 1.5 /animation Cake/Idle.aaf 0 looping 0.8 /followDist 3.0 /moveSlew 0.0666 /moveVelThresh 10.0 /animEaseTime 1.0 /zOffRobot 2.7 /rotX 20.0 /zSpinDef bone_spinA 80.0\"
//OnInspectOrUnlock Menus previewInit Cake/Idle.aaf BirthdayCake< /scale 1.5 /animation Cake/Idle.aaf 0 looping 0.8 /rotSpeed 30 /pos 3.5 0 1 /scaleMult 1.0
property BirthdaySpirit 10
}
unlockType PetFish3 {
commonName \"Lionfish\"
autoTag
category Pet
path flair/
descSymbol PetFish3Desc
dispSymbol PetFish3Disp
flairCfg \"pet flair/PetFishes/PetFish3.amf mat_PetFishes< /scale 1.1 /animation flair/PetFishes/idle3.aaf 0 looping 0.45 /moveAnim flair/PetFishes/fly1.aaf 1 looping 1.62 /followDist 3.0 /moveSlew 0.045 /moveVelThresh 8.0 /animEaseTime 0.45 /zOffRobot 2.6 /rotX 15.0 /moveSlew 0.05 /turnToMove 230\"
}
";
function parseThis($text)
{
$types = array();
preg_match_all('#(unlockType [^\{]+{.+?\n\s*})#s',$text,$matches);
foreach($matches[1] as $str)
{
$typeName = preg_replace('#^[^ ]+ ([^ ]+).*#s','$1',$str);
$contents = preg_split('#(\r?\n)+#',$str);
$contents = array_map('trim',$contents);
array_pop($contents);
array_shift($contents);
$data = array();
foreach($contents as $line)
{
if(substr($line,0,2)=='//') continue;
$parts = preg_split("#(\t+|\s{3,})#",$line);
$title = array_shift($parts);
$partC = count($parts);
$data[$title] = $partC==1 ? $parts[0] : ($partC==0 ? '' : $parts);
}
$types[$typeName] = $data;
}
return $types;
}
$types = parseThis($str);
echo '<pre>'.print_r($types,true).'</pre>';
輸出:
Array
(
[BirthdayCake] => Array
(
[commonName] => "Birthday Cake"
[autoTag] =>
[category] => Item
[path] => models/
[timedExclusive] => 1
[descSymbol] => BirthdayCakeDesc
[dispSymbol] => BirthdayCakeDisp
[flairCfg] => "Cake/Idle.aaf mat_BirthdayCake< /scale 1.5 /animation Cake/Idle.aaf 0 looping 0.8 /followDist 3.0 /moveSlew 0.0666 /moveVelThresh 10.0 /animEaseTime 1.0 /zOffRobot 2.7 /rotX 20.0 /zSpinDef bone_spinA 80.0"
[property] => Array
(
[0] => BirthdaySpirit
[1] => 10
)
)
[PetFish3] => Array
(
[commonName] => "Lionfish"
[autoTag] =>
[category] => Pet
[path] => flair/
[descSymbol] => PetFish3Desc
[dispSymbol] => PetFish3Disp
[flairCfg] => "pet flair/PetFishes/PetFish3.amf mat_PetFishes< /scale 1.1 /animation flair/PetFishes/idle3.aaf 0 looping 0.45 /moveAnim flair/PetFishes/fly1.aaf 1 looping 1.62 /followDist 3.0 /moveSlew 0.045 /moveVelThresh 8.0 /animEaseTime 0.45 /zOffRobot 2.6 /rotX 15.0 /moveSlew 0.05 /turnToMove 230"
)
)
粗糙說明
- 使用
preg_match_all
找到每個塊(unlockType someRandomText {....})
- 遍歷每個結果
preg_match_all
(各塊)來解析塊單獨
- 拆分的
{..}
的由換行的內容,然後每個結果映射到trim()
以除去任何前導和結尾間隔/製表符
- 分割每條線由3米或更多的空間(如適當的標籤似乎並沒有被使用到)
- 使用的第一個結果的分裂是我們陣中的關鍵,那麼分裂的其餘部分推入值
你可以嘗試爆炸的標籤,不是很有效,雖然:( –
看起來像是由製表符/空格隔開,和條目由換行符劃分是它只是數字和沒有空格的字符串,這將是好的問題將是帶引號的字符串,有點棘手與正則表達式匹配.. – MightyPork
爲什麼人們堅持創建自己的非標準標記格式,如果有很多好的標準已經存在?值得知道它來自哪裏,因爲它可能有一個完美的解析器,它看起來很像它可能是程序代碼,但我不認識這種語言。我真的很好奇你從哪裏得到它 - 人們如何向你提供它不能告訴你它是什麼? – Spudley