Zitat:
Zitat von hsiebert
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.
Zitat:
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.
Zitat:
...
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. ;-)