mabu: Regular Expression

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

  1. 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

    1. 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

      1. 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

        1. 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