Ongelmana on siis DOMElementtien kanssa, koska ne haluavat väkisin tehdä merkkimuunnoksia seuraavaan tapaan.
<?php $tekstiKappale = "Kappaleen alku [b]korostus[/b] http://www.linkki.net$linkki"; $muutos['/\[(b|i|em)\]([a-ö0-9A-Ö]+)\[\/(b|i|em)\]/'] = "<em>$2</em>"; $muutos['/(http\:\/\/w{0,3}\.?[a-zA-Z0-9_\?\.&\/\=]+)\$([a-öA-Ö0-9]+)/'] = "<a href=\"$1\">$2</a>"; $muotoilu = preg_replace(array_keys($muutos), array_values($muutos), $tiedot[1]); echo $muotoilu; /* Tulostuu aivan oikein Kappaleen alku <em>korostus</em> <a href="http://www.linkki.net">linkki</a> */ /* Mutta jos tehdään näin */ $p = new DOMElement("p", $muotoilu); $con->appendChild($p); /* Niin tulostus onkin ihan väärin Kappaleen alku <em>korostus</em> <a href="http://www.linkki.net">linkki</a> */
Tietenkin haluavat, koska lisäät tuon pätkän tekstisisältönä, jolloin on loogista, että <a> tulkitaan tekstiksi eikä XML-tagiksi.
Pääset haluamaasi tulokseen DOMDocumentFragment-luokan appendXML-metodilla (epästandardi menetelmä) tai luomalla uuden (väliaikaisen) dokumentin ja lataamalla XML-sisällön sen kautta. Tässä on pieni funktio, joka näkee vaivan puolestasi:
<?php function createElementWithXML($doc, $tag, $xml) { $tmpdoc = new DOMDocument(); # Ladataan "dokumentti" eli generoitu elementti: # <p>Moi, <em>kaveri</em>...</p> $tmpdoc->loadXML("<$tag>$xml</$tag>"); # Kopioidaan elementit kohdedokumentille kelpaaviksi. return $doc->importNode($tmpdoc->documentElement, true); } $xml = "Tekstit <a href='sivu.php?x=y'>linkki</a> tekstit"; $p = createElementWithXML($doc, "p", $xml); $doc->documentElement->appendChild($p); echo $doc->saveXML(); /* <?xml version="1.0"?> <root><p>Tekstit <a href="sivu.php?x=y">linkki</a> tekstit</p></root> */ ?>
Kiitoksia tästä!
Tiesin jotenkin tuon, miksi tuo konversio tapahtuu, mutta en osannut korjata oikein. Purkkaratkaisuna päätin käyttää html_entity_decode() funktiota tulostuksen yhteydessä, joka teki myös tuon muunnoksen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.