Menu
RSS
Kategorie
Nejnovější články
Nejnovější komentáře
- Dnes ve stylu let devadesátých
- Nebylo mi souzeno
- 2012
- STOP všemu, hlavně těm pitomcům
- STOP všemu, hlavně těm pitomcům
| Last.fm - The Zero | |
|---|---|
| Pos | Interpret (skladby) |
| 1 | E-Type (2930) |
| 2 | Groove Coverage (2397) |
| 3 | Sylver (1561) |
| 4 | Ace of Base (1435) |
| 5 | Maya (1221) |
| 6 | Cascada (1095) |
| 7 | Solid Base (1061) |
| 8 | Lewron Orchestra (907) |
| 9 | Milk Inc. (885) |
| Last.fm - Borek | |
|---|---|
| Pos | Interpret (skladby) |
| 1 | Coldplay (1182) |
| 2 | Pink Floyd (650) |
| 3 | Jaromír Nohavica (609) |
| 4 | Brian Tyler (409) |
| 5 | Louis Armstrong (407) |
| 6 | Karel Kryl (339) |
| 7 | Vladimír Mišík (254) |
| 8 | Anat Cohen (223) |
| 9 | Moby (221) |

Malý, ale šikovný
Dneska tu pro vás mám jeden malý, ale šikovný tip. V PHP. Takže většina z těch asi pěti pravidelných čtenářů může přeskočit na poslední větu
.
Už dlouho mě na Cold War trápil problém zapisování ampersandů, tj. &. Protože je to v (X)HTML speciální znak, musí být zapsán pomocí & - jinak se používá k zápisu tzv. entit, jako například symbolů < a > (píší se < a >), které jsou jinak určeny pro tagy a dalších.
Problém spočíval v tom, že ampersand se také používá jako standardní oddělovač proměnných v URL (tedy napříkad http://www.example.com/page.php?foo=bar&ref=nula), kde ty proměnné jsou foo a ref s hodnotami bar a nula. To je asi každému jasné. Když tedy někdo na fórum napsal nějaký odkaz, hned byla stránka nevalidní (chyba: neznámá entita &ref v případě předchozího odkazu) Jenže jednoduché převedení ampersandu na & by znemožnilo zápis jakýchkoli entit, abych mohl na fóru do příspěvku napsat třeba ukázku nějakého html kódu.
Nakonec to vůbec nebolelo:
$msg=str_replace('&', '&', $msg);
$msg=preg_replace('/&(lt|gt|amp|quot|nbsp|sup2);/', '&\1;', $msg);
Celý trik spočívá v tom, že nejprve převedu všechny & na & a tím zajistím validitu a poté zpětně změním známé zápisy na entity. Do onoho seznamu lze doplnit jakoukoli entitu, která vám v něm momentálně chybí.
Samozřejmě, pokud budete chtít, aby se zobrazilo třeba &, musíte napsat &amp;.
PS: Pomalu, ale jistě se propracovávám k nové verzi stránek...
Komentáře
1. MiK
Nechápu, co řešíš. Když cokoliv vypisuju do HTML, tak převádím znaky na entity. [1]. Když kdokoliv bude chtít napsat do fóra ukázku HTML kódu, tak ho normálně vloží - přece ho nebudu nutit, aby ho už vkládal v entitách.
Překládat můžeš i zpětně, [2] ale to prakticky není potřeba. Používat na tohle reguláry mi příjde zbytečné, navíc, když na to má PHP vlastní funkce.
Pokud chceš v HTML zobrazit &, musíš napsat &amp; - to platilo vždycky. :)
[1] http://cz.php.net/manual/en/function.htmlspecialchars.php
[2) http://cz.php.net/manual/en/function.htmlspecialchars-decode.php
2. The Zero
[1] MiK a, málo jsem to vysvětlil.
htmlspecialchars nemůžu použít, protože chci používat některé tagy.
4. The Zero
[3] MiK Pár, a, br, img, code. Včetně parametrů ![]()
(1) http://cz.php.net/manual/en/function.strip-tags.php
5. MiK
[4] The Zero Když tam chceš vkládat tagy, jak jim pak chceš umožnit vkládat HTML?
Včetně parametrů? No nevim, jestli použití strip_tags a vyjmenování výjimek je bezpečný způsob. ;)
6. The Zero
[5] MiK No HTML musí vkládat už s entitami, proto jsem tu funkci taky dělal ![]()
tj. musí napsat něco ve stylu
<a href="foo">odkaz</a>, aby se zobrazilo <a href="foo">odkaz</a> ![]()
7. MiK
[6] The Zero S jdme doma.
Tak to bych Ti tam nevložil nikdy nic. Leda bys tam měl tlačítko "převést na entity", ale stejně je to fuj fuj řešení. ![]()
8. The Zero
[7] MiK No ono se na Cold War na fóru vkládá do příspěvků HTML jednou za uherský rok, takže to nevadí. ![]()
9. MiK
[16] Pak bych to tam nepodporoval vůbec a veškeré tagy bych důsledně ořezával. Jak říkám, strip_tags s výjimkami nevěřit a reguláry jsou zbytečně náročné.