HTML na prostý text, aby nerozbíjel XML. – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

HTML na prostý text, aby nerozbíjel XML. – PHP – Fórum – Programujte.comHTML na prostý text, aby nerozbíjel XML. – PHP – Fórum – Programujte.com

 

fix0
Stálý člen
21. 7. 2022   #1
-
0
-

Ahoj, prosím si o radu, jak nacpat HTML do XML elementu.zkouším to takto:

<?php

//$shortdesc = '<p></p><p class="MsoNormal" style="text-align:jus';

$shortdesc = '$row["popisvhtml"]';
$shortdesc = htmlspecialchars($shortdesc);
$znaku = 1024; // bere pouze prvních 1024 znaků, zbytek ořízne = nejspíše rozbije HTML kód.
$nameext = substr($shortdesc, 0, $znaku);
echo $nameext;

Výsledek vypadá nějak takto:

<xml>
<nameext>&lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;&qu</nameext>

Avšak mnohdy se stane, že asi ten ampersand rozbijí XML strukturu.

Příklad chybové hlášky:

Chyba parsování XML: Dokument není dobře zformátován
Řádek 2502, sloupec 27:
  &lt;w:SaveIfXMLInvalid&g</VALUE>
--------------------------^

Neznáte prosím nějaké šikovné funkce, aby to fungovalo? Ideálně, kdyby to úplně očistilo HTML na skutečně čistý prostý text.

Nahlásit jako SPAM
IP: 31.30.163.–
peter
~ Anonymní uživatel
3888 příspěvků
21. 7. 2022   #2
-
0
-

"Výsledek vypadá nějak takto:"
To je celkem nedostatecne, kdyz nelze zparovat text chyby s textem v ukazce html kodu, protoze to nemas cele :)

obvykle funguje htmlspecialchar. Nekdy je treba zahrnout do toho i uvozovky ' ". Jindy je treba pouzit url encode. Informace k formatu poskytuje ten, co prijima to xml. Tam je napsane, jakym zpusobem se maji tagove znacky resit. Protoze amateri velkych firem neumi pouzit standard a jeho pravidla a pouzivaji jakousi svou ohackovanou pseudoverzi zplacanou narychlo pro sve potreby :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:2df3:5c6:3f2d:e38f...–
peter
~ Anonymní uživatel
3888 příspěvků
21. 7. 2022   #3
-
0
-

jo, hele, a co to tam vidim, jeste? 

$str = htmlspecialchars($str);
$str1024 = substr($str, 0, 1024);

No, to neni uplne jiste, jaky bude vysledek... Oni tam muzou mit i kontrolu html a entita, ktere chybi posledni 3 znaky muze byt povazovava na chybu, text, ktery neni html. Nevim, zda je to resitelny problem, ale muzes zkusit tu entitu odstranit.
strrpos('&') + substring, najit posledni & znak a zkratit text, pokud ten znak od konce neni dal nez 10 znaku (nejsem si ted jisty, jak dlouhe muzou byt entity, lze pouzit hex, dec a textovy zapis jako arrow, nbsp nebo #x32)

Nahlásit jako SPAM
IP: 2001:718:2601:258:2df3:5c6:3f2d:e38f...–
gna
~ Anonymní uživatel
1730 příspěvků
21. 7. 2022   #4
-
+1
-
Zajímavé
fix +

HTML můžeš převést na prostý text pomocí strip_tags a htmlspecialchars_decode (apod.). (A spousty inteligentnějších knihoven).

Pak pokud je v tom XML nějaký limit na délku hodnoty, tak to pravděpodobně bude dekódovaná délka. Takže ten text budeš ořezávat před enkódováním a nedostaneš rozbité entity. Pokud to opravu potřebuješ ořezávat až po enkódování, tak prostě tu případnou rozbitou entitu odmázni [třeba preg_replace('/&[^;]*$/', '', $s)].

Na začátku teda dekóduješ z HTML a pak enkóduješ do XML, tak v těch funkcích použij odpovídající flagy.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3888 příspěvků
21. 7. 2022   #5
-
+1
-
Zajímavé
fix +

Ja bych uvazoval prave i delku entity na konci. Co kdyz pujde o entitu na zacatku stringu a pozdeji uz nee? Tak smazes cely string? :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:2df3:5c6:3f2d:e38f...–
peter
~ Anonymní uživatel
3888 příspěvků
21. 7. 2022   #6
-
+1
-
Zajímavé
fix +

nebo tak, prvne bych si porovnall, zda je encodovany text delsi nez max. A kdyz jo, orezal bych jej a resil posledni & znak od konce, jak je daleko. V opacnem pripade neni treba nic resit.

Nahlásit jako SPAM
IP: 2001:718:2601:258:2df3:5c6:3f2d:e38f...–
gna
~ Anonymní uživatel
1730 příspěvků
21. 7. 2022   #7
-
+1
-
Zajímavé
fix +

Entity budou ukončené středníkem. Pokud tam ten středník chybí, tak je to oříznutá entita na konci stringu. Nic jiného se nesmaže.

Nahlásit jako SPAM
IP: 213.211.51.–
fix0
Stálý člen
25. 7. 2022   #8
-
0
-

$nameext = strip_tags($shortdesc);
 $znaku = 1020;
$nameext = substr($nameext, 0, $znaku);

 

Takhle jednoduché to bylo, stačilo použít strip_tags() a teprve potom to oříznout. Snažil jsem to to tam rvát ve formě oříznutého HTML a ve finále tam HTML  ani být vůbec nemělo... Děkuji všem za rady a pomoc.

Nahlásit jako SPAM
IP: 31.30.163.–
gna
~ Anonymní uživatel
1730 příspěvků
25. 7. 2022   #9
-
0
-

Prosím tě, podívej se k čemu ty zmíněné funkce jsou a pak ti snad dojde, že tohle vůbec nic neřeší.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3888 příspěvků
26. 7. 2022   #10
-
0
-

No, strip_tags jsi mu poradilu uz na zacatku. Vicemene to resi problem tak, ze se html tagu zbavi. Jak psal, v podstate je tam ani nechtel.
Co to neresi, je problem s entitami, ktere muze uriznout. Takze by tam mel pridat jeste i to htmlspecialchars a ten replace od tebe :) Teda, jestli chce mit jistotu, ze mu to nezkolabuje. Musis doufat, ze mu to dojde. nebo, ze mu ten xml zas vyhaze nejake chyby pri importu :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:4584:6661:de2a:923f...–
gna
~ Anonymní uživatel
1730 příspěvků
26. 7. 2022   #11
-
0
-

No já jsem se trochu unáhlil. Nevím, co má pak dál. Teoreticky to může pokračovat ke zdárnému konci, ale známe fixe... :-)

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
26. 7. 2022   #12
-
0
-

#11 gna
Ono je hlavně neštěstí vytvářet XML slepováním stringů. Stačí nějaká blbost na vstupu a přestane to fungovat.

Nahlásit jako SPAM
IP: 213.175.51.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
gna
~ Anonymní uživatel
1730 příspěvků
26. 7. 2022   #13
-
0
-

#12 Kit
Já jsem právě celou dobu myslel na to, že už jsi mu minule poradil DOMDocument, tak proč to dělá jinak.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
26. 7. 2022   #14
-
0
-

#13 gna
Přesně. DOMDocument je trochu náročnější na naučení, ale dají se využít ještě další dva mechanismy: SimpleXML a XMLWriter. Každý z těch tří je lepší než lepení XML echem.

Nahlásit jako SPAM
IP: 213.175.51.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý