Menu
RSS
Kategorie
Nejnovější články
- LíbímSeTi 2.0
- Filmové shrnutí ke konci roku
- Reklamy z té druhé stránky
- Palace Cinemas, můj druhý domov
- Nástrahy přírody
Nejnovější komentáře
| Last.fm - The Zero | |
|---|---|
| Pos | Interpret (skladby) |
| 1 | E-Type (2627) |
| 2 | Groove Coverage (2280) |
| 3 | Sylver (1393) |
| 4 | Ace of Base (1357) |
| 5 | MAYA (1046) |
| 6 | Solid Base (1014) |
| 7 | Cascada (984) |
| 8 | Verona (809) |
| 9 | Lewron Orchestra (767) |
| Last.fm - Borek | |
|---|---|
| Pos | Interpret (skladby) |
| 1 | Coldplay (782) |
| 2 | Jaromír Nohavica (422) |
| 3 | Louis Armstrong (323) |
| 4 | Pink Floyd (211) |
| 5 | Karel Kryl (202) |
| 6 | ABBA (173) |
| 7 | The Beatles (151) |
| 8 | Bobby McFerrin (113) |
| 9 | Anat Cohen (107) |

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é.