не, ну хмл конечно лучше, вполне можно свести к нему. но от нефиг делать можно и свой класс написать. что-нить вроде этого для твоего случая подойдёт.
<?php
/* $txt - текст, который надо распарсить\
* $struct - структура ключей, к которой относится текст на данном этапе парсинга.
* $res - результирующий массив, передаётся по ссылке
*/
class myXML{
private static $SYMB = array('[', ']', '/');
private static $PATTERN_KEY = '/^\w*$/';
public function __construct($txt){
$this->txt = trim($txt);
$this->struct = array();
$this->res = array();
}
public function parceText() {
$this->openKey();
if (substr($this->txt,0,2)==self::$SYMB[0].self::$SYMB[2]) {
$this->closeKey();
} elseif (substr($this->txt,0,1)==self::$SYMB[0]) {
$this->parceText();
} else {
$this->setTxt();
}
}
private function openKey() {
// проверим правильность структуры файла - открытие ключа
if (substr($this->txt,0,1) != self::$SYMB[0] ) {
throw new Exception('Неверный формат файла');
}
// проверим правильность структуры файла - закрытие ключа
$pos = strpos($this->txt, self::$SYMB[1] );
if (!$pos) {
throw new Exception('Неверный формат файла');
}
$key = substr($this->txt, 1, $pos-1);
// проверим правильность структуры файла - допустимый формат ключа
if (!preg_match(self::$PATTERN_KEY, $key)) {
throw new Exception('Неверный формат ключа ' + $key);
}
// проверим правильность структуры файла - дубли ключа
$co = count($this->struct);
$tmp = $this->res;
for ($i=0; $i<$co; $i++) {
$tmp = $tmp[$this->struct[$i]];
}
if (isset($tmp[$key])) {
throw new Exception('В ветке '.implode('-', $this->struct).' имеются дубли ключа '.$key);
}
$this->struct[] = $key;
$this->txt = trim(substr($this->txt, $pos+1));
}
private function setTxt(){
$pos = strpos($this->txt, self::$SYMB[0]);
$txt = substr($this->txt, 0, $pos);
$key = array_pop($this->struct);
$this->pushRes($key, $txt);
$this->txt = substr($this->txt, $pos);
$len = strlen($key)+3;
if (substr($this->txt, 0, $len) != self::$SYMB[0].self::$SYMB[2].$key.self::$SYMB[1]) {
throw new Exception('Не закрыт ключ '.$key.' в ветке '.implode('-', $this->struct));
}
$this->txt = substr($this->txt, $len+1);
}
private function pushRes($key, $txt){
$struct = $this->struct;
if (!count($this->struct)) {
$this->res[$key] = $txt;
} else {
$this->res = $this->addResKey($key, $txt, $this->res, $this->struct);
}
}
private function addResKey($key, $txt, $arr, $struct){
if (!count($struct)) {
$arr[$key] = $txt;
return $arr;
}
$curKey = array_pop($struct);
if (!isset($arr[$curKey])) {
$arr[$curKey]= $this->addResKey($key, $txt, array(), $struct);
} else {
$arr[$curKey]= $this->addResKey($key, $txt, $arr[$curKey], $struct);
}
return $arr;
}
private $txt; // текущий текст, который надо обработать
private $struct; // структура
private $res; // результирующий массив
}
$obj = new myXML('[sss][sss]eeeee[/sss][/sss]');
$obj->parceText();
?>
есть ограничения - в значения полей не должны входить символы $SYMB[0] и $SYMB[1].
хотя если подолбаться - и это можно обойти
зы: CTAPbIu_MABP, квадратные колёса - это нечто))) бесполезное - но занимательное :)