ugrás a tartalomhoz

HTML entity - forrás szinten

bajzarpa · 2011. Szep. 2. (P), 22.01
Sziasztok!

Lehet egy számotokra egyszerű problémával fordulok hozzátok. Azonban nekem beletört a bicskám, és hosszas kutatás után sem találtam megfelelő megoldást.

Ahogy a téma címében is írtam, a HTML Entities-szel van bajom. Adott egy egyszerű CMS, ami XML fájlokban tárolja a weboldal adott tartalmait, ilyen formában:
<content><![CDATA[&lt;p&gt;
	- Ki az abszol&amp;uacute;t kancsal?&lt;br /&gt;
	- Akinek s&amp;iacute;r&amp;aacute;skor a h&amp;aacute;t&amp;aacute;n folynak v&amp;eacute;gig a k&amp;ouml;nnyei.&lt;/p&gt;
]]></content>
Ezen ugye jól látszik, hogy a speciális karaktereket konvertálja. Megjelenítésnél pedig megjelennek szépen. Azonban ha az oldal forrását nézem, akkor ugyan ez a ronda szöveg fogad, mint a fenti kódrészletben. Ez számomra a keresőoldalakon való megjelenésnél okoz problémát, mert ott is ezek a ronda kódok jelennek meg.

Természetesen első utam a php manualhoz vezetett, ahol meg is találtam azokat a funkciókat, amikre azt hittem, hogy majd segítenek, azonban ezek nem forrás szinten konvertálnak, hanem csak a kimenetet.
Kérdésem tehát adott: hogyan tudnám elérni, hogy a forrásban ne a HTML entity-k jelenjenek meg?

Válaszaitokat előre is köszönöm!
 
1

"nem forrás szinten

bugadani · 2011. Szep. 2. (P), 22.35
"nem forrás szinten konvertálnak, hanem csak a kimenetet"? Nem értelek... Amit kiírsz PHP-ban, az a generált HTML forrása lesz effektíve.
A barátod mindenképp a html_entity_decode():
http://hu2.php.net/manual/en/function.html-entity-decode.php

Illetve most látom már, mire gondolhatsz: az ékezetes betűk kétszer vannak kódolva. Ezesetben nincs jobb ötletem, mint kétszer meghívni a nevezett függvényt, na de inkább ne.
2

Decode

Poetro · 2011. Szep. 2. (P), 23.19
Ha egyszer dekódolod, akkor valid HTML-t kapsz, ha kétszer, akkor már nem biztos. A kérdés, hogy mi pontosan a baja a kérdezőnek, mert ha a böngészőben jól jelenik meg az oldal, akkor a keresőmotorok is jól fel tudják dolgozni (kivéve persze, ha az egész csak JavaScript segítségével működik).
3

Igazad van, a kétszer

bugadani · 2011. Szep. 3. (Szo), 00.41
Igazad van, a kétszer dekódolás nem jó dolog vaktában. Viszont ha megnézed a példaadatot, ott az ékezetes karakterek kétszer (ú -> &amp;uacute;), a szimbólumok pedig (<> legalábbis) egyszer vannak kódolva. Azért ajánlottam a kétszer dekódolást, mert az ezt szépen helyrerakná, feltételezve, hogy nincs benne egyszer kódolt &.

Váá, álmos vagyok, nem figyelek arra, mit írok. Mindenesetre a fentieket nem törlöm, tanulságos hülyeség. Poetro válasza a helytálló.
4

Köszönöm az eddigi válaszokat

bajzarpa · 2011. Szep. 3. (Szo), 09.06
De látom nem sikerült le írnom érthetően, hogy mi is a problémám.

Itt egy kép, ami talán többet mesél, mint en tudok: link és a teszt oldal elérhetősége pedig itt

A weboldalon minden speciális karakter tökéletesen jelenik meg, azonban ha megnézitek az oldal forrását, akkor ott bizony az entity-k fogadnak. És a legtöbb bot az forrás szinten nézi és a csúnyábbik verzió lesz látható a találati listán.
5

Eddig rendben van. Amit én

bugadani · 2011. Szep. 3. (Szo), 11.16
Eddig rendben van. Amit én nem értek, az az, hogy az ékezetes karakterek miért kétszer kódolva kerültek az adatforrásba? Egyes WYSIWYG szerkesztők szoktak ilyeneket művelni, és egy ilyen módon már "előkódolt" (nem egészen...) adatra van egyszer ráeresztve a htmlentities(). Ez okoz olyan anomáliákat az adatforrásban, hogy a html tagek relációs jelei, meg egyéb jelek egyszer kerülnek kódolásra, csak épp a már HTML-kód formájában létező ékezetes karakterek (&uacute; mint ú például) & jele is kódolásra kerül (innen vannak az adatforrásban &amp;uacute;-ek pl.)
Ennek legjobb megoldása az lenne, ha az adatforrásba NEM a karakterek HTML-kódja kerülne be, megszűnne minden kimeneti problémád. Viszont ehhez lehet le kell cserélni az adatfájlok tartalmát előállító szerkesztőt. Illetve feldobnék egy olyat, hogy az XML-fájl mentésének a helyén a htmlentities()-t cseréld le htmlspecialchars()-ra, az a betűket nem próbálja átkódolni. Viszont ekkor minden XML-fájlt át kell írnod, mert a már meglévő kétszer-kódolásokat nem oldja meg.
Másik megoldás vagy ugyanitt, mentés előtt, vagy kimeneti oldalon a HTML-karakterkódok visszaállítása ékezetes betűkké, vagy annak elfogadása, hogy ez igenis jól jelenik meg, legfeljebb néhány bot nem képes boldogulni vele :)
Remélem érthető voltam, korán van még... :)
6

Nincs probléma

Poetro · 2011. Szep. 3. (Szo), 11.56
Azokkal a HTML entitásokkal nincs probléma, teljesen szabványosak. Amíg nem voltak elterjedve a kódlapok, addig mindenki (egészen talán a 90-es évek végéig) speciális karakterek helyett entitásokat használt. Ezek azóta is teljesen szabványosak, már a HTML szabvány kezdete óta a specifikációban vannak, és nem is hiszem, hogy valaha kikerülnének belőle. Ebből következik, hogy amelyik bot ezt nem tudja feldolgozni, az magára vessen, nehogy neked kelljen már egy 20 éves technológia miatt többet dolgozni, mikor te eleve mindent megtettél, hogy ennek a technológiának megfelelj. Például a ©, ®, ™ stb jeleket is leggyakrabban mint HTML karakter entitás (&copy;, &reg;, &trade;) fogod látni a dokumentumban, és ezekkel sincs semmi gond, akár csak az &nbsp;-vel, amit írhatnék ' '-nek is, vagy &#x00A0;-nak, vagy &#160;-nak.