Sven: Erste RegEx-Versuche (:

Hallo!

Mit Regular expressions tue ich mich noch etwas schwer. Für einen konkreten Anwendungsfall möchte ich das nun allerdings so weit wie nötig lernen/nachholen.

Vorgegebener Text:

In meinem Text können Stellen alá

==== Test ====  
Inhalt  
==== Testende ====

vorkommen.

Wichtig ist hierbei das ich den Inhalt ab ==== Test ==== haben möchte.

Außerdem ist zu beachten das die = um Test herum variieren können (es sind allerdings vor und nach Test immer die selbe Anzahl von =). Anstatt ==== Test ==== kann ich also auch === Test === finden wollen.

==== Testende ==== hat min. genauso viele = wie um Test herum.

Bei obigem Beispiel würde ich also als nach Test suchen wollen und Inhalt als Rückgabe haben wollen.

Mein erster Ansatz ist

(/=/+)/SUCHWORT/(/=/+)((*).)(/=/+)(.+)(/=/+)

Bin ich total auf dem falschem Dampfer/hab die Doku bisher missverstanden, oder passt das in etwa?

  1. Hi,

    (/=/+)/SUCHWORT/(/=/+)((*).)(/=/+)(.+)(/=/+)

    wo kommen denn bei Dir diese vielen, vielen Slashes her? Entweder rahmen sie die Regular Expression an sich ein (lies: es gibt nur zwei davon, eventuelle weitere müssen escapet werden), oder sie sind ein Zeichen, welches in dem zu durchsuchenden String vorkommen muss. Darüber hinaus hast Du hier die Leerzeichen vergessen, etwas seeehr großzügig mit Klammern um Dich geschmissen, und das Pattern "." enthält per Default nicht den Zeilenumbruch. Ferner solltest Du "." nicht mit "*" verwechseln.

    Bin ich total auf dem falschem Dampfer/hab die Doku bisher missverstanden, oder passt das in etwa?

    Dein Dampfer hat Schlagseite und die Schornsteine an einer etwas unfeinen Stelle, außerdem benutzt Du den Rumpf als Schaufelrad. Ansonsten passt das aber.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      (/=/+)/SUCHWORT/(/=/+)((*).)(/=/+)(.+)(/=/+)

      wo kommen denn bei Dir diese vielen, vielen Slashes her? Entweder rahmen sie die Regular Expression an sich ein (lies: es gibt nur zwei davon, eventuelle weitere müssen escapet werden), oder sie sind ein Zeichen, welches in dem zu durchsuchenden String vorkommen muss. Darüber hinaus hast Du hier die Leerzeichen vergessen, etwas seeehr großzügig mit Klammern um Dich geschmissen, und das Pattern "." enthält per Default nicht den Zeilenumbruch. Ferner solltest Du "." nicht mit "*" verwechseln.

      Hi!

      Danke für die Antwort.

      Ist /=+Suchwort=+.*=+.*=+/ denn richtiger?

      Das + bezieht sich immer nur auf das EINE vorherige Zeichen richtig?
      Und ist .* richtig um alle Zeichen inklusive Zeilenumbrüche einzufangen?

      1. Ist /=+Suchwort=+.*=+.*=+/ denn richtiger?

        Das + bezieht sich immer nur auf das EINE vorherige Zeichen richtig?
        Und ist .* richtig um alle Zeichen inklusive Zeilenumbrüche einzufangen?

        Okay, mitlerweile bin ich bei $pattern = "/.*=+ Test =+(.*)=+.*=+.*/s"; angekommenn.

        Das s benutze ich damit auch Zeilenumbrüche klappen und die Klammer damit ich auf den Inhalt rückreferenzieren kann. Nun haperts noch am 'greedy' Verhalten:

        	$pattern = "/.*=+ Test =+(.*)=+.*=+.*/s";  
        	  
        	$searchItem = "  
        	  
        Vorher  
          
         ========= Test =========  
          
        Testinhalt  
          
        ========= Test2 =========  
          
        Test2inhalt  
          
         =========Test3=========  
          
        Test3inhalt  
          
        =========Test4=========  
          
        Test4inhalt  
          
        === Aha ==";  
          
        	print preg_replace($pattern, "$1", $searchItem);
        

        Das gibt

        [code html]Testinhalt ========= Test2 ========= Test2inhalt =========Test3========= Test3inhalt =========Test4========= Test4inhalt === Aha [/code]

        aus.

        Daran, das nach Aha die == fehlen, meine ich zu erkennen das mein Pattern zu gierig ist. Wo ich jetzt wie die ? einsetzen muss damit ich nurnoch Testinhalt zur Ausgabe habe, da hapert es noch..

        Über Tipps wäre ich sehr dankbar

        1. Hi,

          Das + bezieht sich immer nur auf das EINE vorherige Zeichen richtig?

          auf das vorhergehende Pattern, welches in Deinem Fall ein einzelnes Zeichen ist.

          Und ist .* richtig um alle Zeichen inklusive Zeilenumbrüche einzufangen?

          Durch die von Dir eingesetzte Option /s ist dem tatsächlich so.

          Daran, das nach Aha die == fehlen, meine ich zu erkennen das mein Pattern zu gierig ist. Wo ich jetzt wie die ? einsetzen muss damit ich nurnoch Testinhalt zur Ausgabe habe, da hapert es noch..

          Die Greediness liegt bei den Vervielfältigern "+" und "*" vor. Folgt auf sie ein "?", sind sie nicht mehr gierig.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Merci!

            $pattern = "/.*=+ SUCHWORT =+(.*?)=+.*=+.*/s";

            Das Funktioniert wunderbar, BIS AUF 2 kleine Ausnamen:

            === SUCHWORT ===
            Inhalt

            === Bla ===

            Bei dem Beispiel wird Inhalt nicht erfasst. Bei folgendem jedoch schon:

            === SUCHWORT ===

            Inhalt

            === Bla ===

            Ich habe keine Ahnung wie ich das hinbekommen kann, denn dafür habe ich doch .* mit /s genutzt oder?

            Zum anderen Funktioniert obiges Pattern natürlich auch nicht wenn === SUCHWORT === die letzte Überschrift ist, also danach nurnoch Inhalt kommt.

            Um das zu beheben hatte ich an ein Verhalten ala suche erst nach weiteren == Iwas == und danach nach .*

            Mit der | Pipe kann man ja auch oder setzen, wie setze ich aber so einen langen Ausdruck um? [=+.*=+.*|.*] wirft Syntaxfehler.