Zur Navigation

Regex Element und Elternelement finden

1 Rudy

Hallo,

ich hab hier zu diesem Regex leider keinen Plan. Ich möchte alle img und deren optionale Parent-Tags finden. Imgs zu matchen ist ja kein Problem, aber wie bekomme ich es hin, dass ich in einer Backreference den Tagname des übergeordneten Elements (also jenes, welches das IMG einschließt) bekomme?

Testtext:
<a href="#"><img src="a" title="a" alt="a" /></a>
Pellentesque id velit quis sapien varius eleifend. Maecenas volutpat, mauris sit amet dictum feugiat, <img src="b" title="b" alt="b" />
sem libero vehicula eros, eget dignissim sapien nibh at sem. Maecenas nec nunc. In vitae neque. <img src="c" title="c" />Aenean nec magna. Ut interdum libero facilisis odio. Donec magna. Vivamus placerat tempor massa. 

Mein leider noch kleiner Ansatz:
/<img([^>]+)\/>/

Gibt sowas zurück:

Array
(
    [0] => <img src="a" title="a" alt="a" />
    [1] =>  src="a" title="a" alt="a" 
)
Array
(
    [0] => <img src="b" title="b" alt="b" />
    [1] =>  src="b" title="b" alt="b" 
)
Array
(
    [0] => <img src="c" title="c" />
    [1] =>  src="c" title="c" 
)

Schön wäre etwas in der Art:

Array
(
    [0] => <img src="a" title="a" alt="a" />
    [1] =>  src="a" title="a" alt="a" 
    [2] => a
)
Array
(
    [0] => <img src="b" title="b" alt="b" />
    [1] =>  src="b" title="b" alt="b" 
    [2] =>
)
Array
(
    [0] => <img src="c" title="c" />
    [1] =>  src="c" title="c" 
    [2] =>
)

Danke für Tips
Rudy

24.10.2008 12:39

2 Jörg

Hallo Rudy,

ich habe noch keinen Lösungsansatz, aber eine Frage:

Die beiden anderen imgs haben streng genommen ja auch ein Parent-Tag - z.B. body? Möchtest du nur Parent-Tags identifizieren, die das img direkt umschließen (ohne andere "Geschwister") - wie in deinem Beispiel?

24.10.2008 13:01

3 Rudy

Hm wenn ich recht bedenke stimmt Logik so doch nicht... :/ Also mir geht es darum: ich habe einen HTML-Text, der imgs mit der Klasse 'zoom' enthält. Nun möchte ich alle diese imgs mit einem Link <a> umschließen, sofern sie nicht schon in einem a sind. Nur der Parent-Tag reicht da nicht, ich könnte ja auch <a href="#"><span><img class="align-left zoom" src="a" alt="a" /></span></a> haben, dann kann ich mit span nichts anfangen.

Also die eigentliche Frage ist, wie bekomme ich alle imgs, die NICHT in einem <a> eingeschlossen sind? Wäre natürlich toll wenn es gleich schon nur jene mit der Klasse "zoom" sind, aber nicht unbedingt notwendig, da die Ergebnisse sowieso in einer Callback-Funktion verarbeitet werden, da kann ich auch so die anderen überspringen.

So was ähnliches hätte ich schon mal gebraucht und bin nicht drauf gekommen, damals wollte ich alle Kommas selektieren, die nicht von geschwungenen Klammern eingeschlossen sind. Das wäre ja so zirka das, nur ist es natürlich ein wenig komplizierter mit Tags. Irgend ne Idee?

24.10.2008 13:51

4 Jörg

damals wollte ich alle Kommas selektieren, die nicht von geschwungenen Klammern eingeschlossen sind

Simpel aber aufwändig könnte man 1. alle "{,}" umwandeln in "{IRGENDWASANDERES}", 2. die verbliebenen Kommata behandeln und 3. alle "{IRGENDWASANDERES}" umwandeln in "{,}"

ist nicht sonderlich elegant - aber was besseres fällt mir grad auch nicht ein :/

24.10.2008 14:44

5 Rudy

Das heißt ein preg_replace_callback auf die Inhalte zwischen den <a>s ausführen, eine einmalige id (z.B. md5 des Inhalts) erzeugen, die matches im Text durch die id ersetzen und die matches in einen Array speichern, die imgs auf den verbliebenen Text durchlaufen und danach den Array zurückersetzen. Na ja, nicht super, aber eine Lösung - ich dachte es gäbe vielleicht eine Möglichkeit das in einem Ausdruck unterzubringen, aber das geht auch. Danke für die Hilfe.

24.10.2008 15:46

Beitrag schreiben (als Gast)





[BBCode-Hilfe]