Definierte HTML-Tags inklusive Inhalt aus einem String mit PHP entfernen

Kürzlich bat mich ein Freund darum, ein Script zu schicken, mit dem man pre-Tags aus einem String entfernt, inklusive Inhalt. Er nutzt ein Script, um die Lesezeit für den Inhalt zu berechnen, möchte aber nicht, dass die pre-Tags mit in die Wertung fließen. Falls du also mal ein ähnliches Problem haben solltest, hilft dir dieser Beitrag womöglich weiter.

Tag bestimmen

In unserem Beispiel bestimmen wir den Tag und sagen, es sind alle pre-Tags betroffen. Das heißt, unser regulärer Ausdruck sieht folgendermaßen aus:

/<pre[^>]*>([\s\S]*?)<\/pre[^>]*>/mCode-Sprache: HTML, XML (xml)

Wenn es nur h1-Überschriften betreffen soll, sieht das Ganze so aus:

/<h1[^>]*>([\s\S]*?)<\/h1[^>]*>/mCode-Sprache: HTML, XML (xml)

Und wenn alle Links herausgefiltert werden sollen, dann sieht das so aus:

/<a[^>]*>([\s\S]*?)<\/a[^>]*>/mCode-Sprache: HTML, XML (xml)

Du kannst den regulären Ausdruck für so ziemlich jeden Tag nutzen.

Inhalt ersetzen

Jetzt wollen wir die Tags inklusive Inhalt mit einem leeren String ersetzen, also so, dass sie nicht mehr im String vorhanden sind. Das könnte so aussehen:

$regex = '/<pre[^>]*>([\s\S]*?)<\/pre[^>]*>/m';
$string = 'Mein langer Text mit <pre>etwas Code</pre> und so weiter.';
$string = preg_replace($regex, '', $string);Code-Sprache: PHP (php)

Jetzt werden alle pre-Tags mit einem leeren String ersetzt. Daraus kannst du auch eine Funktion bauen, die recht flexibel ist:

function pxbt_strip_tag(string $tag = 'pre', string $string) {
    $regex = '/<' . $tag . '[^>]*>([\s\S]*?)<\/' . $tag . '[^>]*>/m';
    return preg_replace($regex, '', $string);
}Code-Sprache: PHP (php)

Diese Funktion kannst du jetzt beliebig oft verwenden. Anwendungsbeispiele findest du hier:

$string = 'Mein String';

// h1 entfernen
$string = pxbt_strip_tag('h1', $string);

// p entfernen
$string = pxbt_strip_tag('p', $string);

// pre entfernen
$string = pxbt_strip_tag('pre', $string);Code-Sprache: PHP (php)