2017-05-19 6 views
0

私は輪郭形式のテキスト文書を6レベルまで持つことができます。ネストされた配列を構築する

.step1 -- step 1. text 
..step2 -- step 1. A. text 
..step2 -- step 1. B. text 
..step2 -- step 1. C. text 
..step2 -- step 1. D. text 
..step2 -- step 1. E. text 
.step1 -- step 2. text 
..step2 -- step 2. A. text 
...step3 -- step 2. A. (1) text 
...step3 -- step 2. A. (2) text 
.step1 -- step 3. text 

私は正規表現でテキスト文書を解析し、最終的な目標は、ネストされたXML文書にこれを有効にすることです。この

$contentsArray structure 
    'level' INT - the step level 
    'type' STRING - the type of tag, note, warning, step1, step2 
    'line' INT - the line number in the file 
    'text' STRING - the text 

------ SAMPLE ARRAY ------- 

    [0] => Array 
    (
     [level] => 1 
     [type] => step1 
     [line] => 8 
     [text] => Step 1. text 
    ) 

[1] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 10 
     [text] => Step 1. A. text 
    ) 

[2] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 12 
     [text] => Step 1.B. text 
    ) 

[3] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 14 
     [text] => Step 1. C. text. 
    ) 

[4] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 16 
     [text] => Step 1. D. text. 
    ) 

[5] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 18 
     [text] => Step 1. E. text. 
    ) 

[6] => Array 
    (
     [level] => 1 
     [type] => step1 
     [line] => 20 
     [text] => Step 2. text 
    ) 

[7] => Array 
    (
     [level] => 2 
     [type] => step2 
     [line] => 22 
     [text] => Step 2. A. Text. 
    ) 

[8] => Array 
    (
     [level] => 3 
     [type] => step3 
     [line] => 26 
     [text] => Step 2. A. (1) Text. 
    ) 

[9] => Array 
    (
     [level] => 3 
     [type] => step3 
     [line] => 28 
     [text] => Step 3. A. (2) Text. 
    ) 

[10] => Array 
    (
     [level] => 1 
     [type] => step1 
     [line] => 30 
     [text] => Step 3. Text 
    ) 

のように構成されている配列を構築しています。

<step1>Step 1. text 
    <step2>Step 1. A. text</step2> 
    <step2>Step 1. B. text</step2> 
    <step2>Step 1. C. text</step2> 
    <step2>Step 1. D. text</step2> 
    <step2>Step 1. E. text</step2> 
</step1> 
<step1>Step 2. text 
    <step2>Step 2. A. text 
    <step3>Step 2. A. (1) text</step3> 
    <step3>Step 2. A. (2) text</step3> 
    </step2> 
</step1> 
<step1>Step 3. text 
</step1> 

私が必要とするのは、ネストされた配列を作成してXMLに変換できることです。私は、このアレイの構造は、私は必要なもの

[0] => Array 
     (
      [level] => 1 
      [type] => step1 
      [line] => 8 
      [text] => Step 1. text 
     ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 10 
       [text] => Step 1. A. text 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 12 
       [text] => Step 1.B. text 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 14 
       [text] => Step 1. C. text. 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 16 
       [text] => Step 1. D. text. 
      ), Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 18 
       [text] => Step 1. E. text. 
      ) 
     ) 
    [1] => Array 
     (
      [level] => 1 
      [type] => step1 
      [line] => 20 
      [text] => Step 2. text 
     , Array 
      (
       [level] => 2 
       [type] => step2 
       [line] => 22 
       [text] => Step 2. A. Text. 
       , Array 
       (
        [level] => 3 
        [type] => step3 
        [line] => 26 
        [text] => Step 2. A. (1) Text. 
       ), Array 
       (
        [level] => 3 
        [type] => step3 
        [line] => 28 
        [text] => Step 3. A. (2) Text. 
       ) 
      ) 
     ) 

    [2] => Array 
     (
      [level] => 1 
      [type] => step1 
      [line] => 30 
      [text] => Step 3. Text 
     ) 

ようなものになるだろうと思うことは、私が築いてきた配列をループする方法についていくつかの助けで、最終的な配列内のネストを把握する level値を使用します。私の試みは、この時点までかなり無駄でした。これを行うための再帰的または反復的な方法があるように感じますが、これらは私の強い訴訟ではありません。

助けていただきありがとうございます。私はこの質問が十分明確であることを願っています。

質問を更新する私は質問をするのが非常に貧しい仕事をしたので、私はいくつかの編集をしました。

+0

PHPを使用している場合は、質問に「php」タグを付ける必要があります – alfasin

+0

PHPでこれをやっていますが、これはもっと技術的な質問です。 –

+0

4つのプロパティを持つ連想配列を記述しますが、入力の「テキスト」部分はどこにあり、配列には「text」プロパティがあり、他の3つではありません。 – trincot

答えて

1

あなたの例は一貫していません。最後の...step3が間違いであると仮定すると、これはあなたが望むことをするでしょう。それはperlにありますが、簡単に翻訳するはずです。

sub main { 
    my @labels; 
    while (<>) { 
    if (/^(\.+)(.*)$/) { 
     my $level = length($1); 
     print "</" . pop(@labels) . ">\n" while $level <= scalar(@labels); 
     die "Bad input" unless $level == 1 + scalar(@labels); 
     print "<" . $2 . ">\n"; 
     push @labels, $2 
    } 
    } 
    print "</" . pop(@labels) . ">\n" while (@labels); 
} 

main; 

これは単純なスタックを使用しており、現在のスタックサイズに対して処理レベルが変化しています。

字下げを解消します。スタックサイズにも基づいてこれを行うことができます。

追加

さて、あなたは疑問にかなり変更しました。しかし、スタックの長さに関してスタックを使用し、レベルの変更を処理する基本的な方法は問題なく動作します。ここで

1

は、変数$inputで入力テキストを持っているときのためのPHPの実装です:

$stack = []; 
foreach(explode("\n", $input . "\n.") as $line) { 
    $line = trim($line); 
    $type = ltrim($line, "."); 
    $dots = strlen($line) - strlen($type); 
    if (!$dots || $dots > count($stack) + 1) throw new Exception("Bad input format"); 
    while($dots <= count($stack)) 
     $xml[] = str_repeat(" ", count($stack)-1) . array_pop($stack); 
    $xml[] = str_repeat(" ", count($stack)) . "<$type>"; 
    $stack[] = "</$type>"; 
} 
$xml = implode("\n", array_slice($xml, 0, -1)); 
echo $xml; 

は、それがeval.in上で実行を参照してください。

関連する問題