Regular Expression
mabu
- perl
0 yetanotheruser0 mabu
Hallo,
ich bin ziemlicher Neuling in Sachen RegEx und hab mir was gebastelt, irgendwie funktioniert das jedoch noch nicht ganz ;)
Hier die Erklärung:
Ich habe einen String (eigentlich Datei aber egal), die folgendermaßen aussieht:
<<file:test.php>>
inhalt
<</file>>
<file:test2.php>>
inhalt2
<</file>>
Jetzt hätte ich gerne den Namen und den Inhalt aller Dateien, habe das folgendermaßen machen wollen:
/<<file:(.*)>>(.*)<</file>>/
.* findet ja jede Zeichenfolge... Außer Zeilenendmarkierungen, also hab ich auch
/<<file:(.*)>>([.$]*)<</file>>/
probiert, geht aber genau gleich wenig. Es findet eigentlich gar nichts.
Anfangs hatte ich
/<<file:(.*)>>([^$.]*)<</file>>/
Das fand auch alles, jedoch nicht wenn ein . im Inhalt vorkam. Soviel ich gesehen habe beudeutet ein [^ ja ein Ausschluss einer Zeichenkette...
Beim Dateinamen funktioniert das ganze ja, nur nicht beim Inhalt. Bedeutet also es liegt an den Zeilenumbrüchen, wie kann ich das also lösen?
Danke schonmal!
mfg,
mabu
Normalerweiser liest die PERL Regex Engine Zeilenweise. Also versucht sie dein Pattern auf die erste Zeile mit <<file:test.php>> zu matchen, die Zeile mit Inhalt wird da noch gar nicht betrachtet.
Soweit ich weiss, gibt es eine Option, mit der man die Engine aufrufen kann, die dann eine komplette Datei als einzigen String betrachtet, aber welcher das genau ist, weiss ich leider nicht. Vielleicht findest du ja was in der Doku zu Perl und Regex.
Gruß Ben
Hallo,
hab das ganze nur in die Perl-Sektion geschrieben, da es Perl-RegEx ist, eigentlich verwende ich das ganze in PHP und versuche mit der Funktion preg_match_all() die Daten zu bekommen. Dieser Funktion übergebe ich einen String in dem der komplette Inhalt steht...
mfg,
mabu
Hell-O!
hab das ganze nur in die Perl-Sektion geschrieben, da es Perl-RegEx ist, eigentlich verwende ich das ganze in PHP und versuche mit der Funktion preg_match_all() die Daten zu bekommen. Dieser Funktion übergebe ich einen String in dem der komplette Inhalt steht...
PHP ist zwar nicht unbedingt meine Baustelle, aber in Perl funktioniert sowas:
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use Data::Dumper;
my $string;
print "Content-type: Text/plain\n\n";
while(<DATA>) {
$string .= $_;
}
print $string . "\n";;
my @matches = $string =~ /<file:(.+?\.php)>(.+?)<\/file>/sg;
print Dumper, @matches;
__DATA__
<einlied>
Lied an!
<file:foo.php>
Dingel Dongel
</file>
Dumdideldum
<file:bar.php>
Sabber Fasel
</file>
Lied aus!
</einlied>
Ergibt:
foo.php
Dingel Dongel
bar.php
Sabber Fasel
Wichtig ist der s-Modifier ("single line"), der bewirkt, dass die Zeichenklasse "." auch Newlines enthalten darf. Ebenfalls darf der g-Modifier nicht vergessen werden, schließlich willst du ja alle Treffer finden, nicht nur den ersten.
Siechfred
gudn tach!
hab das ganze nur in die Perl-Sektion geschrieben, da es Perl-RegEx ist, eigentlich verwende ich das ganze in PHP und versuche mit der Funktion preg_match_all() die Daten zu bekommen.
(nur fuer's naechste mal: ) waehle in so einem fall trotzdem "PHP" als thema/sprache aus. "perl-compatible" heissen die dinger zwar, sind sie aber nur bedingt.
Wichtig ist der s-Modifier ("single line"), der bewirkt, dass die Zeichenklasse "." auch Newlines enthalten darf. Ebenfalls darf der g-Modifier nicht vergessen werden, schließlich willst du ja alle Treffer finden, nicht nur den ersten.
diese beiden modifier gibt's in php auch:
http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
prost
seth