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 |
#2 · Zasláno: 7. 6. 2020, 16:10:20
|
||
vtpf Profil * |
#3 · Zasláno: 7. 6. 2020, 17:30:23
Kcko:
nefunguje :-( |
||
MegaPocket Profil * |
#4 · Zasláno: 7. 6. 2020, 18:20:00
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 |
#6 · Zasláno: 7. 6. 2020, 22:52:25
<?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 * |
#7 · Zasláno: 8. 6. 2020, 10:31:26
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 * |
#8 · Zasláno: 8. 6. 2020, 10:31:57
Takhle tedy, pardon
$string = '<html><body><div>ěščřžýáíé</div><p>testik</p> <p>testik2</p></body></html>'; |
||
Keeehi Profil |
#9 · Zasláno: 8. 6. 2020, 11:39:10
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 * |
#10 · Zasláno: 8. 6. 2020, 12:04:25
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 |
#11 · Zasláno: 8. 6. 2020, 13:08:23
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 * |
#12 · Zasláno: 8. 6. 2020, 14:07:38
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 |
#13 · Zasláno: 8. 6. 2020, 16:12:30
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 * |
#14 · Zasláno: 8. 6. 2020, 16:39:36
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 * |
#15 · Zasláno: 10. 6. 2020, 22:07:16
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 ř |
||
Keeehi Profil |
#16 · Zasláno: 10. 6. 2020, 23:14:33
„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. |
||
Časová prodleva: 3 dny
|
|||
vtpf Profil * |
#17 · Zasláno: 13. 6. 2020, 15:31:27
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 |
#18 · Zasláno: 13. 6. 2020, 15:34:04
vtpf:
Vždyť já vím. Řešení pro Sailora je zachovává. Tak kde je problém? |
||
Časová prodleva: 4 roky
|
0