Ankündigung

Einklappen
Keine Ankündigung bisher.

preg_metch_all - Regex

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • preg_metch_all - Regex

    Hallo,

    ich habe ein Problem. Ich möchte aus einer Variable mit preg_match teile auslesen. Die Variable hat folgenden Inhalt:

    Code:
    "Startseite<br/>{if BLAAA==BLUUB}Halli Hallo{/if}<br/>Test Test Test"
    Wie kann ich da folgenden Code auslesen?:
    {if BLAAA==BLUUB}Halli Hallo{/if}

    Ich habe es anfangs so gemacht das ich nur {if BLAAA==BLUUB} auslese, jedoch brauche ich den gesamten Block. Das habe ich so gemacht:

    PHP-Code:
    $pattern sprintf("/\\%s[\s]*(%s)([^\\%s]*)\\%s/i"'{''if''}''}');
    preg_match_all($pattern$this->template$this->conditions); 
    Jetzt habe ich es so probiert:
    PHP-Code:
    $pattern sprintf('/{if \/\/[a-z0-9A-Z.]}+(?(?=[\/])(.*))+{/if}/');
    preg_match_all($pattern$this->template$this->conditions); 
    Jedoch klappt das nicht so ganz. Kann mir dabei evtl. jemand helfen?

    Danke schon mal im voraus.

    Gruß,
    TorrnexT

  • #2
    Grundsätzliches, schau mal hier rein bevor du weiter machst:
    http://www.bastian-frank.de/site/fro...t.php?idart=76

    Zu deinem RegExp: Du musst die geschweifte Klammer escapen, wofür steht dein "if \/\/", das macht nicht deinen Bedingungsblock (oder wo sind da zwei Slashes?) ...
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Hab es mir mal angesehen, jedoch möchte ich die Template Engine

      Und danke für deine schnelle Hilfe, jedoch habe ich es jetzt escaped, jedoch funktioniert es nicht:
      PHP-Code:
      $pattern sprintf('/\{if [a-z0-9A-Z.]\}+(?(?=[\/])(.*))+\{/if\}/'); 
      Sprich es kommt folgender Fehler:
      Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'f' in C:\xampp\htdocs\core.php on line 31

      Ich bin mir nicht sicher wie ich das escapen soll

      Kommentar


      • #4
        Das ist die Stelle "\{/if" am Ende Deiner RegEx. Da Dein Delimiter ein "/" ist ist die RegEx dort zuende.
        "i" ist dann ein known modifier drauf folg das "f" was ein Unknown modifier ist.
        Du musst also dein "/" escapen -> ""\{\/if".

        jedoch brauche ich den gesamten Block
        gib doch mal als String an was genau der ganze Block sein soll.

        das hier ? "{if BLAAA==BLUUB}Halli Hallo{/if}"
        AFFE ist nur im Dezimalsystem ein Palindrom.

        Kommentar


        • #5
          Genau es soll "{if BLAAA==BLUUB}Halli Hallo{/if}" sein, jedoch wenn ich es dann so schreibe wird keine Fehlermeldung mehr angezeigt, sondern ist das Array in das preg_meth_all schreibt leer, sprich da sind keine Einträge drin, aber er zeigt es mit print_r an.

          PHP-Code:
          $pattern sprintf('/{if \/\/[a-z0-9A-Z.]}+(?(?=[\/])(.*))+\{\/if/'); 
          Ich möchte also immer von einem {if ...} bis zum nächsten {/if} auslesen/parsen.

          Kommentar


          • #6
            PHP-Code:
            $string 'Startseite<br/>{if BLAAA==BLUUB}Halli Hallo{/if}<br/>Test Test Test{if BLAAA==BLUUB}Hallo2{/if}';
            //$pattern = '~(\{if\s?.*\{\/if})~US';
            $pattern '~(\{if\s?.*\})(.*)\{\/if}~USs';

            preg_match_all($pattern,$string,$matches);
            echo 
            '<pre>';
            print_r($matches);
            echo 
            '</pre>'
            AFFE ist nur im Dezimalsystem ein Palindrom.

            Kommentar


            • #7
              anmerkung: Die äußeren runden Klammern im RegEx blähen nur das $matches-array unnötig auf.

              Edit: Anmerkung 2: Der Modifier s wäre noch zu empfehlen.

              Kommentar


              • #8
                Hey cool! Vielen viel Dank es funktioniert

                Kommentar


                • #9
                  Ich habe doch nochmal eine Frage:
                  Ich möchte die einzelnen Ergebnisse in einer for-schleife nochmal aufteilen. Jetzt habe ich das so gemacht um nur das IF-Rauszubekommen:

                  PHP-Code:
                      public function evaluate_conditions(){
                      
                  $count count($this->conditions);
                      
                  $condition = array();
                      
                          for(
                  $i=0$i<=$count$i++){
                             
                             
                  $condition_all $this->conditions[0][$i];
                             
                             
                  $pattern '~\{if\s?.*\}~US';
                             
                  preg_match($pattern$condition_all$condition);
                             
                             echo 
                  "<pre>";
                             
                  print_r($condition);
                             echo 
                  "</pre>";
                          }
                      } 
                  Jedoch bekomme ich irgendwie für jedes IF zwei einzelne Arrays :O

                  Code:
                  Array
                  (
                      [0] => {if BLAA==SHOOO}
                  )
                  Array
                  (
                      [0] => {if hioasdhio}
                  )
                  Array
                  (
                      [0] => {if BLAA==SHOOO}
                  )
                  Array
                  (
                      [0] => {if hioasdhio}
                  )
                  $this->conditions ist gleich dem Ergebnis was ich beim ersten parsen rausbekommen habe, sprich den gesamten IF-Block "{if BLAAA==BLUUB}Halli Hallo{/if}".

                  Wie kann ich die Ergebnisse in ein Array schreiben? Sprich das ich die mit $condition[0] und $condition[1] abrufen kann?
                  Ich sage erneut Danke für jegliche Hilfe schon im voraus

                  Gruß,
                  TorrnexT

                  Kommentar


                  • #10
                    ich möchte die einzelnen Ergebnisse in einer for-schleife nochmal aufteilen. Jetzt habe ich das so gemacht um nur das IF-Rauszubekommen:
                    für so was dann lieber wieder runde Klammern benutzen:

                    Pattern für mein Script:

                    PHP-Code:
                    $pattern '~(\{if\s?.*\}).*\{\/if}~US'
                    AFFE ist nur im Dezimalsystem ein Palindrom.

                    Kommentar


                    • #11
                      Das von agundur gesagte gilt auch für weitere Inhalte die du womöglich noch brauchst. preg_match_all kann dies alles in einem Rutsch machen.

                      Kommentar


                      • #12
                        Okay habe ich gemacht, jedoch habe ich irgendwie immer noch je Eintrag zwei Arrays. Wie kann ich das zusammenfassen?
                        Code:
                        Array
                        (
                            [0] => {if BLAA==SHOOO}
                            [1] => {if BLAA==SHOOO}
                        )
                        Array
                        (
                            [0] => {if hioasdhio}
                            [1] => {if hioasdhio}
                        )
                        Array
                        (
                            [0] => {if BLAA==SHOOO}
                            [1] => {if BLAA==SHOOO}
                        )
                        Array
                        (
                            [0] => {if hioasdhio}
                            [1] => {if hioasdhio}
                        )
                        Die Patter Variable sieht jetzt so aus: $pattern = '~(\{if\s?.*\})~US';

                        Kommentar


                        • #13
                          Du sollst Deine Sache mit der Schleife und extra noch mal RegEx ganz sein lassen.
                          Mein Script mit (meiner) modifizierten Regex liefert Dir genau das was Du brauchst.

                          Die runden Klammern sind dazu da Dir Teilergebnisse zu liefern.
                          AFFE ist nur im Dezimalsystem ein Palindrom.

                          Kommentar


                          • #14
                            Dass die äußersten Klammern genau aus dem Grund überflüssig sind, wurde dir doch vorhin schon gesagt... du wirst wohl eher (.*) einklammern wollen.
                            [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                            [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                            Kommentar


                            • #15
                              Ja selbst wenn ich (.*) einklammer habe ich immer noch 4 verschiedene Arrays. Wie kann ich denn ein einzelnes Array bekommen mit nur den {if ...} sachen? Sprich das ich aus einer Variable {if [...]} auslese und das bei jedem For-Schleifen Durchlauf einem Array hinzufüge?

                              Wie soll ich das denn wenn dann ohne Schleife Regeln?

                              Kommentar

                              Lädt...
                              X