ugrás a tartalomhoz

DOMDocument karakterkódolás, saveHTML,saveXML

carstepPCE · 2011. Szep. 14. (Sze), 01.24
Sziasztok,

van egy adatbázis táblám, amiben cikkek vannak mindenféle html formázással, képekkel etc-ra, ide az adatok a htmlspecialchars -sal elkódolva vannak utf8-ban eltárolva. Szerettem volna a képeken pár manipulációt végrehajtani a PHP DOM objektumainak a segítségével. Mindent megcsinált szépen, ahogy kell mindössze nem bírtam elmenteni a kimenetet úgy, hogy a hosszú ő,ű megmaradjon, vagy az ékezetek egyáltalán megjelenjenek.

A kérdéses php fájl UTF-8ban van kódolva, ami a függvényeket és az adatbáziskezelést is csinálja. Próbálkoztam a iconv_set_encoding gal, setlocale -lal, mb_convert_encodinggal, de nem sikerül sehogy sem megtartani az ő,ű ékezeteket.

kód lényeges része:
$d = htmlspecialchars_decode($articletext);
		$x = new DOMDocument();
		$x->loadHTML($d); //utf8_decode($d);
		$imgs = new DOMNodeList();
		$imgs = $x->getElementsByTagName('img');
		if($imgs->length>0){
			$l = $imgs->length;
			for($i=0;$i<$l;$i++){
				$width = 0; $height = 0;
				$item = $imgs->item($i);
				$attrs = $item->attributes; //DOMNamedNodeMap
				$name = $attrs->getNamedItem('src');
				$w = $attrs->getNamedItem('width');
				if($w!=NULL){
					$width = $w->value; //DOMAttr
				}
				$h = $attrs->getNamedItem('height');
				if($h!=NULL){
					$height = $h->value;
				}
				$imgName = generateImgForArticle($name,$width,$height);
				$name->nodeValue = $imgName;
			}
		}
		$article = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $x->saveHTML()));
//		$article = $x->saveXML($x->documentElement->childNodes->item(0)->childNodes->item(0));
ha $d értékét kiíratom simán, akkor rendesen megjelenik minden karakter és a semmilyen formában nincsenek elkódolva az ékezetek (web safe formára gondolok pl.: &Atilde; stb.) az oldal forráskódja alapján.

Igazából, annyi féle kombinációt kipróbáltam már, hogy nem látom a fától az erdőt, és a segítségeteket kérem, hátha ti látjátok mit rontok el?

Üdv
 
1

A következő kód nálam

Poetro · 2011. Szep. 14. (Sze), 02.22
A következő kód nálam tökéletesen működik:
<?php
header('Content-type: text/plain; charset=utf-8');
$articletext = file_get_contents('http://weblabor.hu/forumok/temak/109931');
$d = htmlspecialchars_decode($articletext);
$x = new DOMDocument('1.0', 'utf-8');
$x->loadHTML($d); //utf8_decode($d);
$imgs = new DOMNodeList();
$imgs = $x->getElementsByTagName('img');
if($imgs->length>0){
    $l = $imgs->length;
    for($i=0;$i<$l;$i++){
        $width = 0; $height = 0;
        $item = $imgs->item($i);
        $attrs = $item->attributes; //DOMNamedNodeMap
        $name = $attrs->getNamedItem('src');
        $w = $attrs->getNamedItem('width');
        if($w!=NULL){
            $width = $w->value; //DOMAttr
        }
        $h = $attrs->getNamedItem('height');
        if($h!=NULL){
            $height = $h->value;
        }
    }
}
print($x->saveHTML());
?>
Nem lehet, hogy valahol máshol keletkezik a hiba a dokumentumban? Bár nem tudom, mit csinál a generateImgForArticle de lehet azt is érdemes lenne megnézni.
2

jo utra vezettel

carstepPCE · 2011. Szep. 14. (Sze), 15.49
a generateImgForArticle csak szimpla szoveg allit ossze a img nevenek.

Viszont azzal, hogy te egy weboldalt hivtal be, bekerult egy content type deklaracio is a headben, es ez jelentette a megoldast. Ugyanis elkezdtem e tartalomra vonatkozo elemeket (doctype,content-type) egyesevel a hozzaadni az adatbazisbol jovo tartalomhoz, ami ugye csak HTML fragmenteket tartalmaz.

Tehat konkluziokent azt mondanam, hogy hiaba utf8 kodolas meg minden, ha csak html fragmenteket adsz meg a DOMDocumentnek, akkor nem fogja megfeleloen kezelni a ISO-8859-1 n kivuli karaktereket(bar ez egyenlore csak feltetelezes). Ezert a content type-t hozza kell adni valamilyen formaban. Nalam siman a tartalom ele kerult.

Utana viszont ki kell venni a plusz deklaracokat, esetleg saveXML hasznalni es a megfelelo Node-t megadva neki, hogy megkapd az eredeti tartalmat. Lehet par kreativ megoldasban gondolkodni.

ui.: termeszetesen utolag visszanezve a loadHTML commentjeit, a legelso mar errol szol :)