2013-03-08 25 views
0

我想建立一個解析器,它應該將文本縮進(TAB鍵)轉換爲多級php數組(我很新編程)將文本縮進爲多級數組?

我有一個使用這種格式編寫的txt文件:

test1 
    test2 
     blah3 
    blah4 
    blah5 
     more content 
some more 
    and more content 

解析它應該返回像一個陣列中後:

$myarray[0]['c']     = "test1"; 
$myarray[0]['s'][0]['c']   = "test2"; 
$myarray[0]['s'][0]['s'][0]['c'] = "blah3"; 
$myarray[0]['s'][1]['c']   = "blah4"; 
$myarray[0]['s'][2]['c']   = "blah5"; 
$myarray[0]['s'][2]['s'][0]['c'] = "more content"; 
$myarray[1]['c']     = "some more"; 
$myarray[1]['s'][0]['c']   = "and more content"; 

有可能在PHP構建這樣的功能?

你問我不能使用XML,因爲我已經有一個txt文件 ,將必須先轉換成XML之前

非常感謝你在爲你的答案

回答

0

當然,你可以編寫這樣的解析器。你要做的是實際上構建一個樹形數據結構,該數據結構存儲爲一個數組數組,其中葉節點是文本值,分支由TAB確定。

你需要做的是:

  • 逐行讀取
  • 輸入文本文件的行使用一個變量,以保持當前的縮進
  • 的每一行,確定導致標籤的數量(縮進)
  • 如果縮進符合上一行的縮進,則將該行上的其餘文本作爲當前數組的兄弟添加爲
  • 如果它大於當前縮進1- DD分支(另一個子陣列)
  • 它是小於當前的縮進,設置當前數組相應

皮斯讓我知道如果你需要任何步驟的詳細說明。

UPDATE

這裏有幾個指針。

$file_handle = fopen("myfile", "r"); 
while (!feof($file_handle)) { 
    $line = fgets($file_handle); 

    // process line here 

} 
fclose($file_handle); 

可以使用這樣的代碼檢測各行領先的選項卡數:

$numTabs = 0; 
while(substr($line, $numTabs, 1) == "\t") 
{ 
    $numTabs++; 
} 

然後獲得

你可以用這樣的逐行讀取文件中的行其餘線路使用另一個電話substr

$lineValue = substr($line, $numTabs); 

To tes如果一條線是空白的,你可以使用trim

if(trim($line) == ""){ 
    // line is blank.. just skip it! 
} 
+0

好吧......這很明顯!但感謝您的回答:)我有問題與子字符串和檢測縮進錯誤,如兩個或多個標籤,而不是一個,空行等 – sveva 2013-03-08 15:47:39

+0

,那麼你真的有很多不同的問題。要獲得最好的這個網站,你將不得不單獨詢問他們,但我會嘗試更新一些具體的答案。 – 2013-03-08 16:04:53

+0

嗨,感謝您的幫助!可悲的是我有更多的問題。我使用了一個引用$ this-> currentArray =&$ this-> tree [...] [...] [...];存儲當前的位置,但我不認爲這是一個好主意,因爲我可以更深入(即$ this-> currentArray [...]),但我不能去上層即parent_array($ this-> currentArray) – sveva 2013-03-09 16:53:01