Aarrgh - Regex - bzw. automatisches ändern von img-src

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

  • Aarrgh - Regex - bzw. automatisches ändern von img-src

    Hallo liebes Forum!

    ich weiß, das wird vielleicht dumm klingen, aber ich sitze schon den ganzen tag an einem simplen problem.

    ich habe einen großen string, der jede menge HTML code enthält.

    aus dem möchte ich, für alle img-tags die src anpassen.

    z.B. aus
    <img alt="lalala" src="images/a.gif" title="link" width="20px">
    soll
    <img alt="lalala" src="http://localhost/a.gif" title="link" width="20px">
    werden.

    Aber das soll ach funktionieren, wenn aus:
    <Img alt="lalala" title="link" height="10" SRC="wichtig/mein/images/b.gif" width="20px">
    werden soll:
    <Img alt="lalala" title="link" height="10" SRC="http://localhost/b.gif" width="20px">

    d.h. es darf nicht case sensitive sein -- im endeffekt möchte ich für alle bilder den src auf einen und denselben ordner bringen.

    Ich habe mich zunächst mit regulären ausdrücken probiert, um überhaupt mal an den src teil heranzukommen.

    Das habe ich geschafft mit:

    $pat = "/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)/i";
    preg_match_all($pat,$inhalt, $matches);

    wobei eben in $inhalt der HTML code ist, also etwa:

    $inhalt = "<p>en wnig text und dann ein bild und noch<Img alt=\"lalala\" title=\"link\" height=\"10\" SRC=\wichtig/mein/images/b.gif\" width="20px\"> ein wenig text und <b>mehe</b> und noch ein <img alt=\"lalala\" src=\"images/a.gif\" title=\"link\" width=\"20px\"></p>";

    wenn ich diesen regex anwende, dann erhalte ich in matches in zweidimensionales array, wobei $matches[1][$i] jeweils den src wert enthält (das $i ist eine Zählvariable).

    Hier bin ich quasi stecken geblieben...das muss doch einfacher gehen.
    Kann ich nicht direkt die ersetzung machen?

    Wäre echt toll, wenn mir jemand helfen kann!

    Beste Grüße

    H. Siebert

  • #2
    Zitat von hsiebert Beitrag anzeigen
    Kann ich nicht direkt die ersetzung machen?
    Wenn man Ersetzen möchte, dann nutzt man nicht preg_match_all, sondern preg_replace ...
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Wenn das HTML halbwegs valide ist, könntest du da auch per DOM drüberrupeln.
      Wir werden alle sterben

      Kommentar


      • #4
        Hallo...
        ja an DOM dache ich auch schon, aber das ist eben nicht notwendigerweise valides HTML (auch handelt es sich bei dem HTML um einen Auszug aus einer HTML Seite, nicht das ganze per-se).

        Deswegen ist das mit preg_replace wohl schon der bessere Zug...

        Ich denke mit dem

        $pat = "/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)/i";

        kann ich mal anfangen. ich muss da jetzt jedoch verschiedene "oder" konditionen einbauen, also, dass da mehrere verzeichnisse davor in der struktur kommen könnten, also etwa /imags/was/bild.jpg, daraus soll ja werden http://localhost/bild.jpg.

        D.h. der src steht ja quasi wo {0,1} hier im pattern ist, jetzt muss ich das aber noch verfeinern.

        ich könnte es quasi einfacher machen, wenn ich die php funktion "basename" verwenden kann, weil ich weiß, dass die sachen im src alles pfadangaben sind, also keine URLs -- habt ihr mir einen tipp, wie ich das mit preg_replace umsetzen kann?

        aber vielleicht denk ich einfach auch zu kompliziert (ich muss sagen, REGEX sind nicht meine stärke -- wenn man von stärke überhaupt sprechen kann!!).

        vielen dank und beste grüße
        H Siebert

        Kommentar


        • #5
          Und je nach Umfang (wie viele Dateien; einmaliges Vorhaben oder periodisch/mehrfach auszuführendes), würde ich das vielleicht auch eher mit einem Texteditor machen, der Suchen/Ersetzen mit regulären Ausdrücken ermöglicht.

          Und auch schauen, wie kompliziert der reguläre Ausdruck überhaupt sein muss - vielleicht reicht es ja auch, nach src=".../irgendwas" zu suchen - so oft kommt src als Attribut ja nicht vor, und ein paar SCRIPT/IFRAME-Tags kann man dann zur Not auch manuell wieder auf den Ursprungszustand zurücksetzen.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Zitat von hsiebert Beitrag anzeigen
            ich habe einen großen string, der jede menge HTML code enthält.

            aus dem möchte ich, für alle img-tags die src anpassen.
            Bevor wir zur Tat schreiten: Diesem Problem kann man nicht in jedem Fall mit simplen regulären Ausdrücken beikommen. Mit extrem kaputten HTML kann ein toleranter Parser oft besser umgehen.

            z.B. aus
            <img alt="lalala" src="images/a.gif" title="link" width="20px">
            soll
            <img alt="lalala" src="http://localhost/a.gif" title="link" width="20px">
            werden.

            Aber das soll ach funktionieren, wenn aus:
            <Img alt="lalala" title="link" height="10" SRC="wichtig/mein/images/b.gif" width="20px">
            werden soll:
            <Img alt="lalala" title="link" height="10" SRC="http://localhost/b.gif" width="20px">

            d.h. es darf nicht case sensitive sein -- im endeffekt möchte ich für alle bilder den src auf einen und denselben ordner bringen.
            Für "Case-Insensitivity" gibts den Modifikator "/i", aber das ist dir ja schon aufgefallen.
            Außerdem nehmen wir zur weiteren Problemlösung an, dass du den "Basename" (also den Dateinamen) des Pfadteils beibehalten, den Rest des Pfades aber ändern möchtest.

            ...
            Das habe ich geschafft mit:

            $pat = "/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)/i";
            preg_match_all($pat,$inhalt, $matches);

            wobei eben in $inhalt der HTML code ist, also etwa:

            $inhalt = "<p>en wnig text und dann ein bild und noch<Img alt=\"lalala\" title=\"link\" height=\"10\" SRC=\wichtig/mein/images/b.gif\" width="20px\"> ein wenig text und <b>mehe</b> und noch ein <img alt=\"lalala\" src=\"images/a.gif\" title=\"link\" width=\"20px\"></p>";

            wenn ich diesen regex anwende, dann erhalte ich in matches in zweidimensionales array, wobei $matches[1][$i] jeweils den src wert enthält (das $i ist eine Zählvariable).

            Hier bin ich quasi stecken geblieben...das muss doch einfacher gehen.
            Kann ich nicht direkt die ersetzung machen?
            Yep. Exakt für diesen Zweck haben die PHP-Götter die Funktion preg_replace() erfunden.

            PHP-Code:

            $old 
            '...'// dein Original-HTML
            $new_path 'file://localhorst/';

            $pcre '/(<img.+?src=)(["\']?)([^'"]+?)([^\/]+)(\2.*?\/?>)/is';
            $replace = '$1$2' . $new_path . '$4$5';

            $new = preg_replace($pcre$replace$old); 
            So in etwas müsste das aussehen. Ich hoffe, das funktioniert auf Anhieb.

            Noch ein paar Erklärungen:

            Das zweite Subpattern fängt das linke Quote-Zeichen oder eben keins, wenn keins da ist.

            Das dritte passt auf den Pfad und wird deshalb ersetzt.

            Das vierte Subpattern erfasst alles nach dem letzten Slash bis zum Ende des Dateinamens.

            '\2' ist eine Rückreferenz ("back reference") und passt auf exakt das gleiche Zeichen wie das zweite Subpattern, also '"', "'" oder kein Zeichen. Der Rest versucht alle möglichen Arten von img-Tags zu erfassen: "<img ...>", "<img .../>" und "<img ... />".

            Die Anwendung von preg_match_all() ist übrigens ganz praktisch beim Testen, ob der entwickelte RegEx auch richtig auf alle gewünschten Muster passt.

            *Nachtrag*
            Hehe, das liest sich jetzt so, als ob ich alle Vorposts nicht gelesen hätte.
            Hab ich wirklich geschlagene 23 Minuten gebraucht, um diesen Text zu verfassen?
            Man sollte besser nicht nebenher noch andere Dinge tun. ;-)
            Zuletzt geändert von fireweasel; 12.08.2009, 23:27.
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar

            Lädt...
            X