Schrift
[thread]9238[/thread]

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



<< >> 5 Einträge, 1 Seite
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: )
renee
 2007-07-27 22:11
#79011 #79011
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde Dir auf jeden Fall schonmal raten, die RegEx vorher zu kompilieren...

Code (perl): (dl )
1
2
3
my $regex = qr-    \[% \s* loop \s* \$ (\S+?) \s* %\]
   (.*?)
   \[% \s* end \s* %\]-xms;
, und alle Vorkommen des Ausdrucks einfach durch $regex zu ersetzen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Lightman
 2007-07-27 22:41
#79012 #79012
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Ui, das stimmt natürlich. Habe es gleich mal eingebaut, Danke!
ptk
 2007-07-27 22:47
#79013 #79013
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Lightman,27.07.2007, 18:50](Und ja, ich bin ein Esel, weil ich kein CPAN-Modul nutze :laugh: )[/quote]
Solange du nicht daraus das 245. Template-Modul machst ... :-)
Lightman
 2007-07-27 22:54
#79014 #79014
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,27.07.2007, 20:47]Solange du nicht daraus das 245. Template-Modul machst ... :-)[/quote]
Keine Sorge, es ist nur für's Learning by Doing. Ich bin mir der Tatsache bewusst, dass die Welt nicht noch einen Template-Parser braucht. ;)
<< >> 5 Einträge, 1 Seite



View all threads created 2007-07-27 20:50.