Nochmal reguläre Ausdrücke. Problem mit Zeilenumbruch

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.
 

rellek

relativ sensationell
Teammitglied
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.
 

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';
 

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.
 

rellek

relativ sensationell
Teammitglied
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?
 

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.
 

rellek

relativ sensationell
Teammitglied
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] => 
)


*/

?>
 

rellek

relativ sensationell
Teammitglied
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.
 

Chance

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

rellek

relativ sensationell
Teammitglied
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
        )

)


*/
?>
 

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
 

Chance

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