Ankündigung

Einklappen
Keine Ankündigung bisher.

RegEx: nur bestimmte Teile des Ausdrucks extrahieren

Einklappen

Neue Werbung 2019

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

  • RegEx: nur bestimmte Teile des Ausdrucks extrahieren

    Hallo zusammen!

    Wie kann man aus einem regulären Ausdruck variable Werte rausziehen? Z.B.: Wir suchen nach den Sourcen der IMG-Tags:
    PHP-Code:
    preg_match_all('/src="[^"]*"/'$htmlText$outputArray); 
    Das Ergebnis dieses Snippets ist ein Array mit Elementen wie
    PHP-Code:
    src="/pfad/zum/bild.png" 
    Ich hätte aber gerne eine Möglichkeit, nur bestimmte Teile des Ausdrucks zu extrahieren, in diesem Fall die Pfade (z.B. /pfad/zum/bild.png). So etwas wie:
    PHP-Code:
    preg_match_all('/src="[^"]{suche nach dem ganzen Ausdruck, aber extrahiere nur dieses Segment}"/'$htmlText$outputArray); 
    Und zwar ohne die Notwendigkeit des nachträglichen
    PHP-Code:
    substr($outputArray[0], 5, -1); 
    (Wie) Geht das?

    Danke & Grüße

  • #2
    Zitat von automatix Beitrag anzeigen
    (Wie) Geht das?
    Solche Fragestellungen fallen nicht unter „fortgeschritten“ *verschieb*

    Beschäftige dich mit capturing subpatterns.
    http://www.php.net/manual/en/regexp....ubpatterns.php

    Kommentar


    • #3
      Danke für die rasche Antwort! Aha, das Stichwort ist also subpatterns. OK. Habe jetzt das Manual gelesen. Und sogar verstanden! Tolle Sache! Habe es jetzt fast geschafft:
      PHP-Code:
      preg_match('/src="(?P<src>[^"].*)"/'$imageTag$outputArray); 
      Es kommt aber wider (meinem) Erwarten Folgendes Dabei raus:
      Array (
      [0] => src="pfad/zum/bild.png" width="130"
      [src] => pfad/zum/bild.png" width="130
      [1] => pfad/zum/bild.png" width="130
      )
      Erwartet habe ich natütlich

      Array (
      [0] => src="pfad/zum/bild.png"
      [src] => pfad/zum/bild.png
      [1] => pfad/zum/bild.png
      )
      Was stimmt nicht in meinem regulären Ausdruck?

      Kommentar


      • #4
        Ich hab's!

        PHP-Code:
        '/src="(?P<src>([^"])*)"/' 
        Aber das Ergebnis ist trotzdem etwas seltsam:

        Array
        (
        [0] => src="pfad/zum/bild.png"
        [src] => pfad/zum/bild.png
        [1] => pfad/zum/bild.png
        [2] => g
        )
        Wo kommt denn dieses Element 2 mit dem Wert "g" her?..

        Kommentar


        • #5
          Woher sollen wir wissen wo das g herkommt wenn du uns nicht Zeigst welchen String du überhaupt an die Funktion übergibst?

          Kommentar


          • #6
            Zitat von automatix Beitrag anzeigen
            Wo kommt denn dieses Element 2 mit dem Wert "g" her?..
            Von deiner Klammerung ...
            Code:
            (?P<src>([^"])*)
            Du hast hier ein Subpattern, das auf jeweils genau ein Zeichen matched, das kein " ist.
            Von diesem Subpattern forderst du beliebig viele Wiederholungen, und hast das dann noch mal als weiteres Subpattern geklammert.

            Kommentar


            • #7
              Hier ist der kompletterelevante Code:
              PHP-Code:
              $tempMatchesArray = array();
              $image '<img alt="" border="0" height="42" src="/images/image.png" width="130" />';
              preg_match('/src="(?P<src>([^"])*)"/'$image$tempMatchesArray);
              print_r($tempMatchesArray); 

              Kommentar


              • #8
                Zitat von ChrisB Beitrag anzeigen
                Von deiner Klammerung ...
                Code:
                (?P<src>([^"])*)
                Du hast hier ein Subpattern, das auf jeweils genau ein Zeichen matched, das kein " ist.
                Von diesem Subpattern forderst du beliebig viele Wiederholungen, und hast das dann noch mal als weiteres Subpattern geklammert.
                Stimmt, daran lag es! Jetzt der Code nochmal richtig:
                PHP-Code:
                $tempMatchesArray = array();
                $image '<img alt="" border="0" height="42" src="/images/image.png" width="130" />';
                preg_match('/src="(?P<src>[^"]*)"/'$image$tempMatchesArray);
                print_r($tempMatchesArray); 
                Könntest Du bitte genauer den Zusammenhang zwischen den falsch gesetzten Klammern und dem Element 2 mit Value "g" erklären?

                Nachtrag:

                Ach, klar, den Zusammenhang verstanden. In das Element 2 wird einfach das letzte Vorkommnis des namenlosen Subpatterns ([^"]) gepackt.

                Danke nochmal!

                Kommentar


                • #9
                  Zur Ergänzung: repitive Pattern kann man nicht „capturen“. Aus einem Satz so die Wörter auslesen, wird also bspw. scheitern:

                  Code:
                  ((^|\s)\w+)+

                  Kommentar

                  Lädt...
                  X