Lilly: Regex img Filter mit Ausschluss String

Hallo zusammen,

ich brauche eure Hilfe bei der Zusammenstellung eines Regex und zwar möchte ich <img> Tags aus einer HTML Seite filtern, ich arbeite mit PHP und preg_replace():

'/(<img([^>]*)>)/i'

Das klappt soweit super, aber ich möchte einen Auschluss dabei haben wenn das Attribute data-caption="false" vorkommt, also bei <img data-caption="false" /> soll der Regex nicht anspringen.

Kann mir da jemand weiterhelfen?

Danke und Liebe Grüße!

  1. Tach,

    ich brauche eure Hilfe bei der Zusammenstellung eines Regex und zwar möchte ich <img> Tags aus einer HTML Seite filtern, ich arbeite mit PHP und preg_replace():

    ich würde drngend vorschlagen, das nicht mit einer Regex zu lösen, sondern auf einen Parser zu setzen, z.B. DOMDocument.

    mfg
    Woodfighter

    1. Tach,

      ich brauche eure Hilfe bei der Zusammenstellung eines Regex und zwar möchte ich <img> Tags aus einer HTML Seite filtern, ich arbeite mit PHP und preg_replace():

      ich würde drngend vorschlagen, das nicht mit einer Regex zu lösen, sondern auf einen Parser zu setzen, z.B. DOMDocument.

      mfg
      Woodfighter

      Danke für deine Antwort, hast du ein Bespiel dafür?

      1. Hallo

        ich brauche eure Hilfe bei der Zusammenstellung eines Regex und zwar möchte ich <img> Tags aus einer HTML Seite filtern, ich arbeite mit PHP und preg_replace():

        ich würde drngend vorschlagen, das nicht mit einer Regex zu lösen, sondern auf einen Parser zu setzen, z.B. DOMDocument.

        Danke für deine Antwort, hast du ein Bespiel dafür?

        PHP stellt mehrere klassen zum Zugriff auf das DOM von XML- oder HTML-Dokumenten zur Verfügung. DomDocument ist meiner Meinung nach die am leichtesten erschließbare. Dort gibt es die Methode getElementsByTagName, mit der man Zugriff auf alle Elemente eines Typs in einem Dokument hat. Im ersten Beispiel wird der grundsätzliche Zugriff anhand eines XML-Dokuments als Zeichenkette erklärt. Es darf natürlich auch ein Pfad zu einem Dokument angegeben werden.

        Tschö, Auge

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
      2. Tach,

        Danke für deine Antwort, hast du ein Bespiel dafür?

        http://forum.selfhtml.org/self/2015/jun/05/strip-tags-soll-auch-javacript-loeschen/1642290#m1642290 wäre sowas ähnliches (beachte bitte auch den Rest des Threads).

        mfg
        Woodfighter

      3. Hallo,

        ich würde drngend vorschlagen, das nicht mit einer Regex zu lösen, sondern auf einen Parser zu setzen, z.B. DOMDocument.

        Danke für deine Antwort, hast du ein Bespiel dafür?

        Gerade erst vorgestern hier durchgelaufen.

        http://forum.selfhtml.org/self/2015/jun/09/alle-links-und-titel-der-links-aus-einer-datei-extrahieren/1642557#m1642557

        Und noch ein paar Threads weiter zurück, wie man sie aus dem Dokument löschen kann mittels DOMDocument-Klassen http://php.net/manual/en/class.domdocument.php

        http://forum.selfhtml.org/self/2015/jun/05/strip-tags-soll-auch-javacript-loeschen/1642280#m1642280

        Besonders zu beachten dabei die Hinweise von Felix zur LifeNodeList zum Löschen gefundener Nodes aus dem DOM (wenn man alle Nodes in der Liste entfernen will):

        while ($__found_nodes->length > 0)
        {	
        	$__found_nodes->item(0)->parentNode->removeChild($__found_nodes->item(0));
        }	
        

        Grüße
        TS

        1. Moin!

          while ($__found_nodes->length > 0)
          {	
          	$__found_nodes->item(0)->parentNode->removeChild($__found_nodes->item(0));
          }	
          

          Wow.

          Ist wohl kein Zufall, dass das DOMDocument-Zeug irgendwie genau so wie Javascript aussieht … (s/->/./g)

          Jörg Reinholz

          1. Selber Moin :-)

            while ($__found_nodes->length > 0)
            {	
            	$__found_nodes->item(0)->parentNode->removeChild($__found_nodes->item(0));
            }	
            

            Wow.

            Ist wohl kein Zufall, dass das DOMDocument-Zeug irgendwie genau so wie Javascript aussieht …

            Ist tatsächlich ziemlich ähnlich vom Aussehen. Die Ordnung von Klassen, Methoden und Properties ist auch ähnlich verknotet. Alle Tricks, die damit möglich sind, habe ich auch noch nicht verstanden. Es kann aber noch deutlich weniger, als JavaScript.

            Was mich daran stört ist, dass viele Informationen per Read-Only Property abgefragt werden müssen, statt per Methode, einige aber schon. Das wäre mMn konsequenter. So muss man immer erst ins Handbuch gucken, ob es z.B. ->length heißt oder ->length().

            Grüße
            TS

  2. Tach!

    Das klappt soweit super, aber ich möchte einen Auschluss dabei haben wenn das Attribute data-caption="false" vorkommt, also bei <img data-caption="false" /> soll der Regex nicht anspringen.

    Man kann das musterbasiert angehen. Aber das hat irgendwo seine Grenzen, weil es eben nur musterbasiert ist und nicht sämtliche mögliche Feinheiten der Syntax abbilden kann. Du kannst das also hier nicht so formulieren "wenn das Attribut xyz vorkommt", weil es aus Sicht des Regex kein Attribut ist sondern nur eine Zeichenfolge. Die Frage ist also, an welcher Stelle die Zeichenfolge in deinem Fall steht, und da musst du sie dann erkennen. Dazu fallen mir auf die Schnelle Assertions ein. Die schauen nur in die Zukunft oder Vergangenheit, ohne diese Fundstellen zu verarbeiten (non-capturing), und es gibt sie auch in negativer Form, also "wenn da kein xyz folgt". Da kannst du ja mal schauen, ob das was wird. Ein konkretes Beispiel kann ich nicht geben.

    dedlfix.

    1. @@dedlfix

      Regex […] Dazu fallen mir auf die Schnelle Assertions ein. Die schauen nur in die Zukunft oder Vergangenheit

      Und damit wäre Regex genausowenig die Abkürzung von regular expression wie charset die Abkürzung von character set ist.

      LLAP 🖖

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)