Warum funktioniert über mehrere Zeilen suchen nicht ?
xNeTworKx
- perl
Hallo,
ich hab das Problem, daß ich einen Suchausdruck über mehrere Zeilen anwenden will, zB ich will alles einlesen was zwischen <text> und </text> steht. Es funktioniert aber nicht, er findet einfach nix.
Ich lese das ganze File als Skalarwert ein ,aber er findet trotzdem nichts.
So lese ich ein:
#!C:/Perl/bin/Perl.exe -w
use strict;
my $in;
print "Content-type:text/html\n\n";
open(FILE,"1012512977.txt") or die "cant open File : $!\n";
while (<FILE>) {
$in .= $_
}
print $in;
Wenn ich jetzt aber:
if ($in =~ /<text>(.*)</text>/) {
$inhalt = $1;
}
print $inhalt;
drauf anwende, passiert gar nichts. Er findet nichts.
So sieht mein Probefile aus:
<top><topic>Network test</topic><name>network</name><email>----</email><hpadresse>----</hpadresse><text>ftrhzdtrhzu dtrhdr
<br>
<br>drz drz drz
<br>
<br>srz b zdtrzu dtu r
<br>
<br>
<br>
<br> duzdrz drz dr zdrz dr zdrz crz dtrz h
<br>
<br>
<br>bui zbvtzu</text></top>
P.S Wenn ich den ganzen Inhalt ausgeben lasse, macht er mir zwischen jedes <br> noch eine Leerzeile, was wahrscheinlich die Ursache dafür ist, daß er nichts findet, aber wie kann ich das umgehen ?
Hallo nochmal,
ich habe jetzt eine vorübergehende, nicht so elegante Lösung:
#!C:/Perl/bin/Perl.exe -w
use strict;
my $in;
my $inhalt;
print "Content-type:text/html\n\n";
open(FILE,"1012512977.txt") or die "cant open File : $!\n";
while (<FILE>) {
$in .= $_
}
$in =~ s/<br>/<umbruch>/g;
$in =~ s/\n//g;
if ($in =~ /<text>(.*)</text>/) {
$inhalt = $1;
$inhalt =~ s/<umbruch>/<br>/g;
}
print $inhalt;
Weis einer vielleicht noch eine bessere Lösung ?
Hallo Unaussprechlicher ;-)
. findet normalerweise keine Zeilenumbrüche.
Das kannst Du aber erzwingen:
/.*/s #jetzt werden auch Zeilenumbrüche gefunden.
Grüße
Daniel
Hallo,
ich habs jetzt überhaupt so gemacht :
while (<FILE>) {
chomp;
$in .= $_
}
Die Perl Zeilenumbrüche kann ich ruhig wegschneiden, da \n mit <br> sowieso beim speichern ersetzt wird, und ich somit nicht nochmal Zeilenumbrüche brauch. Das is auch das einzige was mit verwundert, woher eigentlich die die 2. Zeilenumbrüche kommen. Also statt
<br>egte drtdr
<br>dghdfghdr trhz
<br>g eg drhtrhdtrhdf
würde
<br>mhuuiz8zhu
<br> iuuiziuzhu
<br> iuio zuuizh
stehen.
Aber egal, Problem gelöst.
Hallo,
ich hab das Problem, daß ich einen Suchausdruck über mehrere Zeilen anwenden will, zB ich will alles einlesen was zwischen <text> und </text> steht.
So lese ich ein:
#!C:/Perl/bin/Perl.exe -w
use strict;
my $in;
$/ = ''; # siehe perldoc perlvar: hier steht der Trenner zwischen den einzelnen "Zeilen" (jetzt nur noch eine Zeile)
print "Content-type:text/html\n\n";
open(FILE,"1012512977.txt") or die "cant open File : $!\n";
$in = <FILE>;
print $in;
close(FILE);
Wenn ich jetzt aber:
if ($in =~ /<text>(.*)</text>/) {
if ($in =~ /<text>(.*?)</text>/g) {
# 1. das ? hinter dem *: Damit wird der * auf faul gestellt. Nimm
# folgende Situation:
# dann findet dein regex ösjlölkdsj</text><text>hhh
# meiner findet nur ösjlölkdsj
# 2. das 'g' ganz am Ende:
# befiehlt deinem regex global zu suchen
$inhalt = $1;
}
print $inhalt;
Tschö Matti