Nochmal reguläre Ausdrücke. Problem mit Zeilenumbruch

Dieses Thema im Forum "Backend: PHP und MySQL" wurde erstellt von Chance, 21 August 2010.

  1. Chance

    Chance Member

    Mein RegX:
    Code:
    \[<-(.*)->\](.*)
    Meine Vorgabe:
    Code:
    [<-->] Test 1
    [<-Array A->] Test 2
    [<-->] Test 3
    Test Hallo
    [<-Array B->] Test 2
    Test Hallo 2
    Mein Problem ist, der Code funktioniert wie ich es wünsche, bis ich versuche mehere Zeilen mit einzubeziehen.
    Denn dann wird die Vorgabe falsch aufgeteilt.
     
  2. rellek

    rellek relativ sensationell Mitarbeiter

    Du brauchst den Modifier m (also #(regex)#m).

    Ich bin mir auch nicht sicher, ob das mit den < und > so einfach geht, weil das eigentlich für Look-Ahead-Ausdrücke ist.
     
  3. Chance

    Chance Member

    Bringst nichts... mit m. ^$ werde nicht benutzt. Und bei Einsatz finder er komischerweise nichts mehr o_O .
    Und bei s ändert sicht die Erkennung vollständig, das mit dem Ergebnis nichts mehr anzufangen ist.

    Im Momment sieht es so aus :
    PHP:
    $pattern '°\[\<-(.*)-\>\](.*)°s'
     
  4. Chance

    Chance Member

    So sieht es ohne Mehrzeilig aus:

    Code:
    Array
    (
        [0] => Array
            (
                [0] => [<-->] Test 1
                [1] => 
                [2] =>  Test 1
            )
    
        [1] => Array
            (
                [0] => [<-Array A->] Test 2
                [1] => Array A
                [2] =>  Test 2
            )
    
        [2] => Array
            (
                [0] => [<-->] Test 3
                [1] => 
                [2] =>  Test 3
            )
    
        [3] => Array
            (
                [0] => [<-Array B->] Test 2
                [1] => Array B
                [2] =>  Test 2
            )
    
    )
    
    
    Das zweite Array sollte das mehrzeilige enthalten.
     
  5. rellek

    rellek relativ sensationell Mitarbeiter

    Nja, was soll er denn finden?
    Vielleicht solltest du ihn ungreedy machen. Weil .* ist halt alles. Also alles alles. Verstehen Sie? ;)

    Soll er
    [<-(.*)->](.*)
    bis zum nächsten [<- finden?
     
  6. Chance

    Chance Member

    Hilft auch nicht :S .
    Ich habe schon alles ausprobiert... sobald es mehrere Zeilen sind...

    das [<-xxx->] gibt es nur in einer Zeile.
    Was danachkommt, wieder bis zum [<-xxx->] darf Mehrzeilig sein.
    Und da liegt das Problem. der erste. darf nicht von s beinflusst werden... habe auch schon ersatz ausprobiert... aber dann findet er das gleiche oder weniger.
     
  7. rellek

    rellek relativ sensationell Mitarbeiter

    Brauchst halt nen ordentlichen Delimiter.

    Das ist bei dir nicht so einfach, weil diese Tags nicht geschlossen werden. Ich würde da die Idee von Nerdus wieder aufgreifen mit dem Split.
    Gleiche Indizes in den beiden Ziel-Arrays gehören in dem Fall zusammen...
    PHP:
    <?php

    $string 
    '[<-->] Test 1
    [<-Array A->] Test 2
    [<-->] Test 3
    Test Hallo
    [<-Array B->] Test 2
    Test Hallo 2'
    ;

    echo 
    $string."\n\n\n";

    $res preg_split('#\[<-#Us'$string);
    print_r($res);

    $name = array();
    $value = array();
    for(
    $i 1$i <= count($res); $i++) {
        
    $name[] = preg_replace('#(.*)(-\>\])(.*)\z#Us''$1'$res[$i]);
        
    $value[] = preg_replace('#(.*)(-\>\])(.*)\z#Us''$3'$res[$i]);
    }

    echo 
    'name:';
    print_r($name);
    echo 
    'value:';
    print_r($value);

    /*

    [<-->] Test 1
    [<-Array A->] Test 2
    [<-->] Test 3
    Test Hallo
    [<-Array B->] Test 2
    Test Hallo 2


    Array
    (
        [0] => 
        [1] => ->] Test 1

        [2] => Array A->] Test 2

        [3] => ->] Test 3
    Test Hallo

        [4] => Array B->] Test 2
    Test Hallo 2
    )
    name:Array
    (
        [0] => 
        [1] => Array A
        [2] => 
        [3] => Array B
        [4] => 
    )
    value:Array
    (
        [0] =>  Test 1

        [1] =>  Test 2

        [2] =>  Test 3
    Test Hallo

        [3] =>  Test 2
    Test Hallo 2
        [4] => 
    )


    */

    ?>
     
  8. Chance

    Chance Member

    Eine Idee ist es :) .

    Aber Abgeschlossen ist es durch [<- bzw. dem Variablenende.
     
  9. rellek

    rellek relativ sensationell Mitarbeiter

    Nja, wenn du mal rausgucken lassen würdest, was denn erlaubte Zeichen sind, könnte man ja aus dem .* ein [alle erlaubten zeichen hier]* machen (müsste man \s als zeilenumbruch und leerzeichen usw mit einschliessen), dann würde er von selbst beim [<- einen neuen Treffer machen.
     
  10. Chance

    Chance Member

    Im ersten sind es alle Alphanumerischen Zeichen, beim zweiten alle Zeichen, die möglich wären, auch Zeilenumbrüche.
     
  11. rellek

    rellek relativ sensationell Mitarbeiter

    Dann sag das doch.

    PHP:
    <?php

    $string 
    '[<-->] Test 1
    [<-Array A->] Test 2
    [<-->] Test 3
    Test Hallo
    [<-Array B->] Test 2
    Test Hallo 2'
    ;

    echo 
    $string."\n\n\n";

    preg_match_all('#\[<-([a-z0-9_-\s]*)->\] ([a-z0-9_-\s]*)#is'$string$res);
    print_r($res);
    exit;

    /*

    [<-->] Test 1
    [<-Array A->] Test 2
    [<-->] Test 3
    Test Hallo
    [<-Array B->] Test 2
    Test Hallo 2


    Array
    (
        [0] => Array
            (
                [0] => [<-->] Test 1

                [1] => [<-Array A->] Test 2

                [2] => [<-->] Test 3
    Test Hallo

                [3] => [<-Array B->] Test 2
    Test Hallo 2
            )

        [1] => Array
            (
                [0] => 
                [1] => Array A
                [2] => 
                [3] => Array B
            )

        [2] => Array
            (
                [0] => Test 1

                [1] => Test 2

                [2] => Test 3
    Test Hallo

                [3] => Test 2
    Test Hallo 2
            )

    )


    */
    ?>
     
  12. Chance

    Chance Member

    Danke :)

    Hatte es mit \w Versucht... das war mein Fehler :/ .
     
  13. Chance

    Chance Member

    Kleiner Fehler... <> wird uch benöigt, & etc. d.h. was in HTML vorkommt.
    Und die Zeilen am Anfang werden nicht erkannt, wenn kein [<-->] zuerst kommt.
    Hmmm.... muss noch etwas probieren
     
  14. Chance

    Chance Member

    Ich habe es gelöst, ohne reguläre Ausdrücke zu nehmen.
    Das deprecated Split habe ich gegen Explode ausgetauscht.
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deinem Erleben anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden