3 Stimmen

Verwendung von Regex, um HTML-Tags zu entfernen

Ich muss konvertieren

$text = 'Wir hatten Spaß. Schau dir dieses Foto von Joe an';

[Bearbeiten] Es könnten mehrere Links im Text vorhanden sein.

zu

$text = 'Wir hatten Spaß. Schau dir dieses Foto (http://example.com) von Joe an';

Alle HTML-Tags sollen entfernt werden und der href-Wert von den Tags soll wie oben hinzugefügt werden.

Wie könnte man dies effizient mit Regex lösen? Ein Code-Schnipsel wäre toll.

5voto

nc3b Punkte 14414

Zuerst führen Sie ein preg_replace durch, um den Link zu behalten. Sie könnten verwenden:

preg_replace('(.*?)', '$\2 ($\1)', $str);

Verwenden Sie dann strip_tags, um den Rest der Tags zu entfernen.

1voto

Javier Parra Punkte 1902

Verwenden Sie einen XML-Parser, um jedes Tag durch seinen inneren HTML-Inhalt und die a-Tags durch ihr href-Attribut zu ersetzen.

http://www.php.net/manual/de/book.domxml.php

1voto

Gordon Punkte 304254

Die DOM-Lösung:

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach($xpath->query('//a[@href]') as $node) {
    $textNode = new DOMText(sprintf('%s (%s)',
        $node->nodeValue, $node->getAttribute('href')));
    $node->parentNode->replaceChild($textNode, $node);
}
echo strip_tags($dom->saveHTML());

und das Gleiche ohne XPath:

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('a') as $node) {
    if($node->hasAttribute('href')) {
        $textNode = new DOMText(sprintf('%s (%s)',
            $node->nodeValue, $node->getAttribute('href')));
        $node->parentNode->replaceChild($textNode, $node);
    }
}
echo strip_tags($dom->saveHTML());

Alles was es tut, ist, jedes HTML in eine DomDocument-Instanz zu laden. Im ersten Fall verwendet es einen XPath-Ausdruck, der so etwas wie SQL für XML ist, und ruft alle Links mit einem href-Attribut ab. Dann erstellt es ein Textknoten-Element aus dem innerHTML und dem href-Attribut und ersetzt den Link. Die zweite Version verwendet einfach die DOM-API und kein XPath.

Ja, es sind ein paar Zeilen mehr als bei Regex, aber das ist sauber und einfach zu verstehen und es wird keine Kopfschmerzen bereiten, wenn Sie zusätzliche Logik hinzufügen müssen.

0voto

Frank V Punkte 24349

Ich habe Dinge wie diese mit Variationen von substring und replace gemacht. Heute würde ich wahrscheinlich regex verwenden, aber du wolltest eine Alternative, also:

Für die Tags würde ich etwas wie das tun:

_

$text = replace($text, "", "");
$text = replace($text, "", "");

(Mein php ist wirklich eingerostet, also ist replace vielleicht nicht der richtige Funktionsname - aber die Idee ist das, was ich teile.)

Das Tag ist ein wenig kniffliger. Aber es ist möglich. Du musst den Punkt finden, an dem anfängt und an dem `>` endet. Dann extrahierst du die gesamte Länge und ersetzt das schließende

`

Das könnte etwas so aussehen:

$start = strrpos( $text, "", $start );
$text = substr( $text,  $start, $end );
$text = replace($text, "", "");

(Ich weiß nicht, ob das funktioniert, nochmal, die Idee ist das, was ich kommunizieren möchte. Ich hoffe, die Codefragmente helfen, aber sie funktionieren wahrscheinlich nicht "out of the box". Es gibt auch viele mögliche Bugs in den Codeausschnitten, abhängig von deiner genauen Implementierung und Umgebung)

Referenz:

`_

0voto

Erik Punkte 20180

Es ist auch sehr einfach mit einem Parser zu machen:

# verfügbar von http://simplehtmldom.sourceforge.net
include('simple_html_dom.php');

# parsen und ausgeben
$html = str_get_html('Wir hatten Spaß. Schau dir dieses Foto von Joe an');

$a = $html->find('a');
$a[0]->outertext = "{$a[0]->innertext} ( {$a[0]->href} )";

echo strip_tags($html);

Und das erzeugt den Code, den du in deinem Testfall haben möchtest.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X