0

我正在尝试构建一个解析器,该解析器应该将文本缩进(TAB KEY)转换为多级 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 之前,因为我已经有了必须先转换为 xml 的 txt 文件

非常感谢您的回答

4

1 回答 1

0

当然你可以写一个这样的解析器。您要做的实际上是构建一个树数据结构,该结构存储为数组数组,其中叶节点是文本值,分支由 TAB 确定。

你需要做的是:

  • 逐行读取输入文本文件
  • 使用变量来保持当前缩进
  • 对于每一行,确定前导制表符的数量(缩进)
  • 如果缩进与前一行的缩进匹配,则将该行上的其余文本作为同级添加到当前数组
  • 如果它比当前缩进大 1,则添加一个分支(另一个子数组)
  • 小于当前缩进,对应设置当前数组

如果您需要对这些步骤中的任何一个进行更多说明,请告诉我。

更新

这里有一些建议。

您可以使用以下内容逐行读取文件:

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

   // process line here

}
fclose($file_handle);

您可以使用如下代码检测每行中前导 TAB 的数量:

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

然后使用对substr的另一个调用来获取该行的其余部分:

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

要测试一行是否为空白,您可以使用trim

if(trim($line) == ""){
   // line is blank.. just skip it!
}
于 2013-03-08T15:37:14.330 回答