Preg_replace frage

hey,
ich bräuchte mal hilfe mit preg_replace.
ich möchte aus <img … /> <a …>… machen.
das habe ich bisher probiert, aber es funktioniert nicht.

grüße,
sebastian

Aus was willst du was genau machen?

aus z.B. test
soll das werden:
aaa

BUMP

Woher kommen denn die Daten, die du so umwandeln willst?

$a = '<img title="aaa" src="url_zum_bild" alt="test" />';
if(!sscanf($a, '<img title="%s" src="%s" alt="%s" />', $title, $src, $alt))
   die("Fehler!");
$b = sprintf('<a href="%s" rel="lightbox" title="%s">%s</a>', $src, $title, $title);

Wieder mal ein gutes Beispiel dafür, dass man in den wenigsten Fällen reguläre Ausdrücke braucht :smiley:

[quote=“michi7x7”] $a = '<img title="aaa" src="url_zum_bild" alt="test" />'; if(!sscanf($a, '<img title="%s" src="%s" alt="%s" />', $title, $src, $alt)) die("Fehler!"); $b = sprintf('<a href="%s" rel="lightbox" title="%s">%s</a>', $src, $title, $title);

Wieder mal ein gutes Beispiel dafür, dass man in den wenigsten Fällen reguläre Ausdrücke braucht :smiley:[/quote]

sauber gelöst
problematisch wenn die reihenfolge der attribute variiert

ja, dann könnte man es direkt durch einen DOM-Parser lassen

$a = new SimpleXMLElement('<img title="aaa" src="url_zum_bild" alt="test" />');

$src = $a['src'];
$title = $a['title'];

$b = sprintf('<a href="%s" rel="lightbox" title="%s">%s</a>', $src, $title, $title);

klappt das auch, wenn die imgs in anderem content sind?
also, wenn sie nicht alleine dastehen??

so recht weiß ja keiner was du hier eigentlich machen willst

kannst auch die ganze page durchjagen

probier doch einfach selber ob es klappt, dann lernst es auch besser
außerdem freu ich mich immer derb wenn was funktioniert g

schön’ sonntag!

Wenn das ganze Zeug was daherkommt valides XML (oder wenigstens valides HTML) ist, kannst du Problemlos mit SimpleXML oder DOM arbeiten :wink:

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($input); //loadHTML ignoriert Fehler

$xpath = new DOMXPath($dom);
$imgs = $xpath->query("img");

foreach($imgs as $img) {
   $simg = simplexml_import_dom($img); //SimpleXML-Element
   
   $src = $simg['src'];   //Alte Daten holen
   $title = $simg['title'];

   $new = $dom->createElement('a', $title); //Neues Element erstellen
   $new->setAttribute('href', $src);
   $new->setAttribute('rel', "lightbox");
   $new->setAttribute('title', $title);
   
   $img->parentNode->replaceChild($new, $img); //img-Element durch neues a-Element ersetzen
}

gibt keine bessere Methode :wink:

sry, ich steh grad ein bisschen aufm schlauch.
wenn ich das in eine funktion packe, was ist dann die return variable?

Das ganze arbeitet direkt am DOMDocument. Das veränderte Element bekommst du mit $dom->saveXML(), das ganze ist danach XML (XHTML)-Valid :wink:

So wie die Funktion momentan arbeitet, werden ALLE img-Tags bearbeitet. Vielleicht solltest du noch ein paar Filter anfügen (zB. title-Tag muss gesetzt sein - isset($simg[‘title’]) )

okay, vielen dank.
kann ich das ganze auch irgendwie in eine variable speichern, oder ist das nicht möglich?