Wie kann ich verhindern, dass Php-DOMDocument-Codierung von html-entities?
Ich habe eine Funktion, die ersetzt Anker "href" - Attribut in einen string mit Hilfe von Php-DOMDocument-Objekt. Hier ist ein snippet:
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($text);
$anchors = $doc->getElementsByTagName('a');
foreach($anchors as $a) {
$a->setAttribute('href', 'http://google.com');
}
return $doc->saveHTML();
Das problem ist, dass loadHTML($text) umgibt den $text in der doctype, html, body, etc. tags. Ich versuchte zu arbeiten, um dieses dadurch statt loadHTML():
$doc = new DOMDocument('1.0', 'UTF-8');
$node = $doc->createTextNode($text);
$doc->appendChild($node);
...
Leider, dies kodiert für alle Elemente (Dübel im Lieferumfang enthalten). Weiß jemand wie man dies ausschalten? Ich habe schon gründlich durchgesehen, die docs und versucht, hacking, aber es kann nicht herausfinden.
Dank! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn diese Platzhalter haben einen strengen, genau definierten format eine einfache preg_replace oder preg_replace_callback könnte den trick tun.
Ich habe nicht vor, das hantieren über html-Dokumente mit regex im Allgemeine, aber für eine kleine, gut definierte Teilmenge Sie geeignet sind.
XML hat nur sehr wenige vordefinierte Entitäten. Alles, was Sie html-entities definiert sind woanders. Wenn Sie loadhtml() diese entity-Definitionen sind laden automatisch, mit loadxml() (oder keine Last (an allen) sind Sie nicht.
createTextNode() macht genau das, was der name vermuten lässt. Alles übergeben Sie als Wert wird als text behandelt und nicht als markup. I. e. wenn Sie etwas, das hat eine Besondere Bedeutung für den markup-Code (<, >, ...) es ist codiert in einer Weise, dass ein parser unterscheiden kann, der text von der eigentlichen markup-Symbole (<, >, ...)
Wo kommt $text her? Kannst du nicht tun, der Austausch innerhalb der eigentlichen html-Dokument?
Ich landete hacken diese in eine gewisse Weise ändern:
in:
Dieser schneidet den unnötigen Müll, ändern:
in diesem:
Kann jemand herausfinden, etwas besser?
OK, hier ist die Letzte Lösung, die ich endete mit. Beschlossen zu gehen mit VolkerK Vorschlag.
Hiermit rufen Sie die Funktion mit einer Reihe von verschiedenen Anker-Attribute.