Nochmal reguläre Ausdrücke. Problem mit Zeilenumbruch

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

  1. Chance Benutzer

    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 Bundesfurzender

    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 Benutzer

    Bringst nichts... mit m. ^$ werde nicht benutzt. Und bei Einsatz finder er komischerweise nichts mehr :confused: .
    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 Benutzer

    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 Bundesfurzender

    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 Benutzer

    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 Bundesfurzender

    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 Benutzer

    Eine Idee ist es :) .

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

    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 Benutzer

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

    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 Benutzer

    Danke :)

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

    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 Benutzer

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

Die Seite empfehlen