Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: DOMElement ja character konversio

Teuro [22.04.2009 22:20:17]

#

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 &lt;em&gt;korostus&lt;/em&gt; &lt;a href="http://www.linkki.net"&gt;linkki&lt;/a&gt; */

Metabolix [22.04.2009 23:11:52]

#

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>
*/
?>

Teuro [22.04.2009 23:21:24]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta