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.