Malý, ale šikovný

The Zero, neděle 11. 2. 2007 - 14:30

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í &amp; - jinak se používá k zápisu tzv. entit, jako například symbolů < a > (píší se &lt; a &gt;), 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 &amp; 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('&', '&amp;', $msg);
$msg=preg_replace('/&amp;(lt|gt|amp|quot|nbsp|sup2);/', '&\1;', $msg);

Celý trik spočívá v tom, že nejprve převedu všechny & na &amp; 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 &amp;, musíte napsat &amp;amp;.

PS: Pomalu, ale jistě se propracovávám k nové verzi stránek...

Zařazeno do kategorie PHP.

Předchozí: Nejsem normální (Čech)

Následující: Budoucnost do vašich domovů

Komentáře

1. MiK

12.02.2007 13:26:42

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 &amp;, musíš napsat &amp;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

12.02.2007 16:11:32

[1] MiK a, málo jsem to vysvětlil.
htmlspecialchars nemůžu použít, protože chci používat některé tagy.

3. MiK

12.02.2007 16:14:21

[2] The Zero Jaké? :)

4. The Zero

12.02.2007 16:16:26

[3] MiK Pár, a, br, img, code. Včetně parametrů :)

(1) http://cz.php.net/manual/en/function.strip-tags.php

5. MiK

12.02.2007 16:42:50

[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

12.02.2007 16:45:08

[5] MiK No HTML musí vkládat už s entitami, proto jsem tu funkci taky dělal ;)

tj. musí napsat něco ve stylu
&lt;a href="foo"&gt;odkaz&lt;/a&gt;, aby se zobrazilo <a href="foo">odkaz</a> :)

7. MiK

12.02.2007 16:49:28

[6] The Zero S jdme doma. :D 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

12.02.2007 16:51:21

[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

12.02.2007 16:54:59

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

10. The Zero

12.02.2007 17:07:24

[9] MiK Neee, zase jsi mě špatně pochopil. Tagy se občas používají, ale ukázky html kódu skoro vůbec - tak jsem to myslel.

Myslím, že tohle nikam nevede :))

Přidat komentář

Jako heslo je to proto, že lze využít magic wand a odpověď se tak bude pamatovat.

Povolené tagy: b, i, q. Bez jakýchkoli atributů a řádně ukončené. URL se převádí automaticky.

Vyžadováno je pouze jméno (proto je zvýrazněné), text, kód (ten zadáváte jen s vypnutým JavaScriptem - jestli ho nevidíte, nemusíte se o něj starat. Poslední věc, kterou formulář vyžaduje, je stisknutí tlačítka Přidat.

* E-mail slouží především k načtení gravatarů. Zobrazovat se nebude.