Felix Riesterer: Regex um <img>-Elemente mit und ohne alt-Attribut

Beitrag lesen

Liebe Mitlesende,

ich möchte den HTML-Quelltext einer Datei zu reinem Text reduzieren, um ihn inhaltlich durchsuchbar zu machen. Dabei entferne ich <img>-Elemente, bei denen ich jedoch ein eventuell gesetztes alt-Attribut (ich kenne das Muss aus der Spec) inhaltlich erhalten will.

Beispiel:

Schau mal: <img src="./dir/file.png" id="f" alt="flying dogs">  
Magst Du <img src="./dir/file2.jpg" class="favorites" title="Schoki bis zum Abwinken" />?

Aus obigem Code soll werden:

Schau mal:  flying dogs  
Magst Du   ?

Es soll also der Alt-Text in ein vorausgehendes und ein nachfolgendes Leerzeichen eingebettet als Ersatz für das ganze <img>-Element stehen. Ist kein Alt-Text vorhanden, stehen eben nur die Leerzeichen.

Folgenden PHP-Code habe ich erfolgreich getestet, jedoch kann er fehlende alt-Attribute nicht erkennen:

$entry['text'] = preg_replace(  
    '~(?is)<img[^>]*?alt="([^"]*)"[^>]*/?>~',  
    ' $1 ',  
    $tmp['html']  
);

Wenn ich das alt-Attribut optional mache (also in runde Klammern mit nachfolgendem Fragezeichen setze), wird der Inhalt nicht mehr als Ersatz notiert - so als würde keiner gefunden:

$entry['text'] = preg_replace(  
    '~(?is)<img[^>]*?(alt="([^"]*)")?[^>]*/?>~',  
    ' $2 ',  
    $tmp['html']  
);

Bei dem zweiten Code-Beispiel wird zwar das gesamte <img>-Element durch zwei Leerzeichen ersetzt, der Inhalt des alt-Attributs wird aber in keinem Fall eingetragen.

Wer kann mir helfen, dass der Inhalt des alt-Attributs nach der Ersetzung wieder erscheint?

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)