2013-01-20 2 views
1

У меня есть этот файл, я не могу понять, как разбирать этот файл.Как разбирать файл с PHP

type = 10 
version = 1.2 
PART 
{ 
    part = foobie 
    partName = foobie 
    EVENTS 
    { 
     MakeReference 
     { 
      active = True 
     } 
    } 
    ACTIONS 
    { 
    } 
} 
PART 
{ 
    part = bazer 
    partName = bazer 
} 

Я хочу, чтобы это массив, который должен выглядеть

$array = array(
    'type' => 10, 
    'version' => 1.2, 
    'PART' => array(
     'part' => 'foobie', 
     'partName' => 'foobie, 
     'EVENTS' => array(
      'MakeReference' => array(
       'active' => 'True' 
      ) 
     ), 
     'ACTIONS' => array(
     ) 
    ), 
    'PART' => array(
     'part' => 'bazer', 
     'partName' => 'bazer' 
    ) 
); 

Я попытался с preg_match, но это не было успешным. Любые идеи?

+0

Где делает формат? Почему бы просто не использовать формат, который может читать PHP, например JSON, INI, XML и т. Д.? –

+0

Вы должны показать, что вы пробовали. Не проявляя собственных усилий, это действительно вопрос типа «напишите, что парсер для меня». – mario

+2

Мне пришло в голову, что формат выглядит как TypoScript (используется TYPO3). Это так? Если да, тогда вы должны изучить парсер TYPO3. –

ответ

0

Вот мой подход.

Прежде всего измените меня, изменив {на линию раньше. Thats довольно легко

$lines = explode("\r\n", $this->file); 
foreach ($lines as $num => $line) { 
    if (preg_match('/\{/', $line) === 1) { 
     $lines[$num - 1] .= ' {'; 
     unset($lines[$num]); 
    } 
} 

Теперь вход выглядит так

PART { 
    part = foobie 

Теперь мы можем сделать все это в XML вместо этого, я знаю, что я сказал PHP массив в вопросе, но XML объект все еще достаточно хорош.

foreach ($lines as $line) { 
      if (preg_match('/(.*?)\{$/', $line, $matches)) { 
       $xml->addElement(trim($matches[1])); 
       continue; 
      } 

      if (preg_match('/\}/', $line)) { 
       $xml->endElement(); 
       continue; 
      } 

      if (strpos($line, ' = ') !== false) { 
       list($key, $value) = explode(' = ', $line); 
       $xml->addElementAndContent(trim($key), trim($value)); 
      } 
} 

addElement, на самом деле просто добавляет к строке EndElement добавляет и addElementAndContent делать как и добавить содержимое между ними.

И только для создания всего контента является объект XML, им с помощью

$xml = simplexml_load_string($xml->getXMLasText()); 

И теперь $ XML является XML-объект, который намного проще работать с :)

1

Почему бы не использовать формат, который PHP может декодировать изначально, например, JSON?

http://php.net/json_decode

$json = file_get_contents("filename.txt"); 
$array = json_decode($json); 
print_r($array); 
+0

Может быть, у него нет другого выбора? – Gumbo

+0

@ Gumbo может быть. Но он может быть! Мы увидим –

+0

Im не «владелец» файла, поэтому его невозможно изменить в формате, я бы, конечно, изменил его на ini, json или подобное, если это было возможно – Martin

Смежные вопросы