Autor Zpráva
vtpf
Profil *
Ahoj mám toto:

$dom = new \DOMDocument('1.0', 'UTF-8');
    $dom->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));

a přemění české znaky za entity a to já nechci. Nevíte jak to opravit.


ještě sem dám celý kod kdyby byl problém v něčem jiným
libxml_use_internal_errors(true);

    $dom = new \DOMDocument('1.0', 'UTF-8');
    $dom->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));

    // Strip wrapping <html> and <body> tags
    $mock = new \DOMDocument;
    $body = $dom->getElementsByTagName('body')->item(0);
    foreach ($body->childNodes as $child) {
        $mock->appendChild($mock->importNode($child, true));
    }

    $fixed = trim($mock->saveHTML());

    return $fixed;
Kcko
Profil
vtpf:
Zkus Disable html entity encoding in PHP DOMDocument
vtpf
Profil *
Kcko:
nefunguje :-(
MegaPocket
Profil *
vtpf:
To nebude problém té části kodu, výstup nasledujícího nejsou entity. Podíval bych se spíše co je ukládáno do té proměnné $string.
<?php
$string = '<html><body>ěščřžýáíé<br></body></html>';

$dom = new \DOMDocument('1.0', 'UTF-8');
    $dom->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));

    var_dump ($dom->textContent);
    echo '<br>';
    echo $dom->textContent;
vtpf
Profil *
je to v pořádku ale když nechám vypsat to ve $fixed tak tam jsou ty entity.


na ty entity to převádí kód od toho $mock
Keeehi
Profil
<?php

$string = '<html><body><div>ěščřžýáíé</div></body></html>';

libxml_use_internal_errors(true);
 
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->loadHTML(mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8'));
 
// Strip wrapping <html> and <body> tags
$mock = new \DOMDocument('1.0', 'UTF-8');
$body = $dom->getElementsByTagName('body')->item(0);
foreach ($body->childNodes as $child) {
    $mock->appendChild($mock->importNode($child, true));
}

$fixed = trim($mock->saveHTML($mock->documentElement));
 
return $fixed;
Sailor
Profil *
Keeehi:
Stačí když přidám do onoho HTML něco víc a to se tam už nikdy nezobrazí i když dle tvého kódu mělo, protože to projíždí všechny děti v body.
Co dělám špatně?

<?php

$string = '<html><body><div>ěščřžýáíé</div></body></html>';
Sailor
Profil *
Takhle tedy, pardon

$string = '<html><body><div>ěščřžýáíé</div><p>testik</p> <p>testik2</p></body></html>';
Keeehi
Profil
Sailor:
Špatně je to, že odstraňuješ <body>. $mock->documentElement vrací .. no jak to nazvat .. rodičovský prvek dokumentu. Tedy ten který je na nejvyšší úrovni a obaluje své další potomky. Jenže když odstraníš body, tak máš najednou na nejvyšší úrovni tři prvky (div, p, p). Tak $mock->documentElement ti prostě vrátí ten první z nich.

Ono se to celé dá asi udělat i jednodušeji, ovšem docela by pomohlo, kdybys nám řekl, k čemu to má sloužit. A taky co je to za zdroj dat. Tím myslím zda je to třeba výstup z nějakého html wysiwyg editoru na tvé stránce, nebo je to třeba feed dodavatele produktů pro eshop, nebo něco jiného. Podle toho se k tomu pak taky přistupuje.
Sailor
Profil *
Keeehi:
Řeším to samé co tazatel. s PHP domem se obecně pracuje líp než s reguláry, ale narážím na to samé, potřebuji pak pozměněnou strukturu uložit, tj saveHtml() s tím, že se mi tam taky dostanou entity a pak je to celé obalené v tagu HTML a BODY.

Obě věci tam nechci. Zkoušel jsem nějaké řešení na SO, ale tohle zrovna není uplně vychytané a blbě se s tím pracuje.
Keeehi
Profil
Tak znova, dá se to řešit, ale záleží na tom, k čemu to má být určeno a jaký je zdroj dat. Možných řešení je samozřejmě více a je potřeba vybrat to správné. Nikdo se vám tady nebude vymýšlet s řešením kde u zadání nejsou jasné podminka a omezení protože to většinou skončí tím že: "Díky, to já ale nemůžu použít protože XYZ". Když všechny XYZ dopředu nenapíšete, tak tím jen maříte lidem čas, který vám tu dobrovolně věnují.
Sailor
Profil *
Keeehi:
Mám nějaký fragment na stránce (div) ve kterém potřebuju udělat spoustu věcí (upravit odkazy atd).
To je všechno v pohodě, pak ten div potřebuju "aktualizovat, tj nahradit nově vzniklým HTML, to je taky v pohodě.

Potřebuji si to nové HTML, čili co mi vráti metoda saveHtml() mít bez entit a bez toho co defaultně generuje saveHtml() tj, tagy body a html.

Díky.
Keeehi
Profil
Sailor:
Tak pokud je to tvůj fragment html ve kterém chceš udělat změny, vygenerovat nové html a ten text tam zasadit, pak bych to udělal třeba takto
<?php

$string = '<div>ěščřžýáíé</div><p>testik</p> <p>testik2</p>';

$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->loadHTML('<body>'.mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8').'</body>');

// změny na $dom

echo substr($dom->saveHTML($dom->documentElement), 12, -14);

Prostě si to body kolem toho fragmentu ručně přidám a nakonec ho zase odstraním (i s automaticky přidaným html tagem).
Sailor
Profil *
Keeehi:
Super, to mě nenapadlo, škoda, že metoda saveHtml nemá nějaký parametr, který by to řešil, každopádně díky!
vtpf
Profil *
já potřebuju opravit případné chyby v nedokončeném tagu např, zde chybý uzavírací tag </div>:
<div>nějaký parametr, <a href="#">který</a> by to ř
tahle funkce to řeší ale konvertuje ty české znaky. Ale já tam žádné body ani html navíc nemám. Máte řešení i pro mě?
Keeehi
Profil
Ale já tam žádné body ani html navíc nemám.
Body tam neměl ani Sailor. Proto si ho tam taky v řešení přidávám.

Jak jsem už ale několikrát psal, je potřeba celkem přesně popsat problém, zdroj dat a způsob užití výstupu. I když to nebylo od Sailora úplné, bylo to dostatečné na to, abych si domyslel o co mu zřejmě jde. Ty jsi to stále ještě pořádně nepopsal. Možná bude vhodné řešení co jsem napsal pro Sailora, možná že ale vůbec vhodné nebude. Jenže momentálně bych potřeboval věšteckou kouli abych to mohl určit.
vtpf
Profil *
hm, tak když se koukneš na moji první zprávu tak problém je že do proměnné mock se ukládají české znaky v podobě entit. Ale já bych ty české znaky chtěl zachovat.
Keeehi
Profil
vtpf:
Vždyť já vím. Řešení pro Sailora je zachovává. Tak kde je problém?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0