Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9221[/thread]

RegEx: Über mehrere Zeilen suchen



<< >> 4 Einträge, 1 Seite
Lightman
 2007-07-24 22:34
#78809 #78809
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte Strings der Form
Code: (dl )
1
2
3
4
5
6
7
8
[% loop $name %]

...
<h1>$title</h1>
<p>$content</p>
...

[% end %]


untersuchen. Dabei stellt $name den Namen der Loop dar und alles zwischen [% loop $name %] und [% end %] den Inhalt. Diesen möchte ich rausfiltern und in einem nächsten Schritt nach $xyz parsen.

Mein Problem: Wie kann ich den Inhalt heraustrennen? Mein Ansatz:
Code: (dl )
1
2
3
4
5
6
7
($x = $string) =~ s/
       \[% \s* loop \s* \$ (\S+?) \s* %\] # [% loop $name %]
       (\.*?)                             # Alles mögliche, will ich haben
       \[% \s* end \s* %\]                # [% end %]
   /
       $2 if $1 eq $name
   /xms;


Klappt aber leider nicht. Was muss verändert werden? Was könnte man besser machen?

(Btw: Bitte keine Hinweise zu CPAN-Modulen. Ich bin mir dessen bewusst, dass ich mir unnötige Arbeit mache. ;) )\n\n

<!--EDIT|Lightman|1185302173-->
Ishka
 2007-07-24 23:13
#78810 #78810
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
wenn du das s-Flag setz, dann trifft der . auch auf Zeilenumbrüche zu. Und möglicherweise willst du auch noch das g-Fag verwenden, aber siehe auch perlre.

Solltest trotzdem lieber n Modul verwenden ;)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
sid burn
 2007-07-25 02:26
#78811 #78811
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Code: (dl )
(\.*?) 

Da ist ein Backslash zu viel. Das mus folgendermaßen heißen.

Code: (dl )
(.*?)

Wenn da ein Backslash davor ist findest du explizit 0-unendlich Punkte was du wahrscheinlich nicht willst.

Ansonsten wie bereits gesagt einfach die Option "s" Nutzen. Dadurch matcht der Punkt auch auf ein Newline Zeichen. Aber das nutzt du ja schon wie ich gerade sehe. Liegt also eher an deinem escapten Punkt warum es nicht geht. ;)

Und ja, du solltest lieber ein Modul wie HTML::Template oder Template::Toolkit verwenden. :D\n\n

<!--EDIT|sid burn|1185316189-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Lightman
 2007-07-25 18:35
#78812 #78812
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Ay, das ist mir in letzte Nacht im Bett noch eingefallen, dass es ja . und nicht \. ist. ;) Danke trotzdem, funktioniert soweit.
<< >> 4 Einträge, 1 Seite



View all threads created 2007-07-24 22:34.