Thread Schöner programmieren mit RegEx: Wie kann man das besser machen? (4 answers)
Opened by Lightman at 2007-07-27 20:50

Lightman
 2007-07-27 20:50
#79010 #79010
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Hallo Community,

nachfolgender Perl-Code soll in einem String nach dem folgenden Muster suchen
Code: (dl )
1
2
3
4
5
6
7
8
9
10
        [% loop $story %]

           <div class="story">
               <h2 class="title">[% $story_title %]</h2>
               <div class="content">
                   [% $story_content %]
               </div>
           </div>

       [% end %]


und [% $story_title %] sowie [% $story_content %] wiederholt ersetzen (als Schleife).

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/perl

use strict;
use warnings;

# Template-Datei (Quick & Dirty)
my $template = '
<html>

   <body>

       <div id="content">

       [% loop $story %]

           <div class="story">
               <h2 class="title">[% $story_title %]</h2>
               <div class="content">
                   [% $story_content %]
               </div>
           </div>

       [% end %]

       </div>

   </body>

</html>
';

# Name der Loop
my $loop_name = "story";

# Array mit Hashes
my @array = (
   {
       story_title   => "Erste Überschrift",
       story_content => "Erster Inhalt",
   },
   {
       story_title   => "Zweite Überschrift",
       story_content => "Zweiter Inhalt",
   },
);

local ($1, $2, $3);

# Nach Loop-Muster suchen...
$template =~ m/
   \[% \s* loop \s* \$ (\S+?) \s* %\]     # [% loop $string %]
   (.*?)                                  # $loop_content
   \[% \s* end \s* %\]                    # [% end %]
/xms;

my $loop_content = $2 if $1 eq $loop_name; # Inhalt der Loop (zwischen den Tags)

my $result;

for my $hash_ref ( @array ) {              # Hashes aus dem Array rausholen
   my $temp = $loop_content;              # Loop-Inhalt zwischenspeichern

   for my $key ( keys %{$hash_ref} ) {    # Keys der Hashes durchgehen
       $temp =~ s/
           \[% \s* \$ (\S+?) \s* %\]      # Nach [% $string %] suchen
       /                                  # Ersetzen, falls im Hash vorhanden
           $hash_ref->{$1} if exists $hash_ref->{$1}
       /exms;
   }

   $result .= $temp;
}

# Die Loop im Template durch die geparste Loop ersetzen...
$template =~ s/
   \[% \s* loop \s* \$ (\S+?) \s* %\]
   (.*?)
   \[% \s* end \s* %\]
/
   $result
/xms;

print $template;


Funktioniert alles einwandfrei, nur sieht es potthässlich aus. Besteht die Möglichkeit, die einzelnen RegEx'es in einen einzigen RegEx zu hauen oder den Code zumindest zu vereinfachen?

(Und ja, ich bin ein Esel, weil ich kein CPAN-Modul nutze  :laugh: )

View full thread Schöner programmieren mit RegEx: Wie kann man das besser machen?