Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

Návštěvní kniha v PHP bez použití databáze - ošetření textů

22. 02. 2001 | Michal Kebrt | PHP | Komentáře: 0

V minulém článku jsme si pověděli, jak vypisovat příspěvky po 20, jak změnit atributy souboru atd. Dnes přidáme několik dalších funkcí, které budou využívat regulární výrazy. Jedná se o dělení dlouhých slov, povolení některých tagů a automatickou detekci odkazů v textu zprávy.

Vzhledem k tomu, že soubor kniha.php3 se od minula v ničem podstatném nezměnil, připomeňme si pouze, že údaje získané z formuláře máme v těchto proměnných: jméno v proměnné $jmeno, e-mailovou adresu v $email, webovou adresu v $web a konečně text zprávy v $zprava.

Nyní se tedy můžeme pustit do souboru insert.php3. Nejprve odstraníme všechny nebezpečné znaky, které by mohly narušit formátování, a to pomocí funkce HTMLSpecialChars. Poté uložíme všechny údaje kromě textu zprávy do tabulky.

//odstraneni nebezpecnych znaku
$jmeno = HTMLSpecialChars($jmeno);
$email = HTMLSpecialChars($email);
$web = HTMLSpecialChars($web);
//formatovani prispevku
$jmeno = "<table><tr><td class=jmeno>$jmeno</td></tr>";
$email = "<tr><td class=odkaz><A HREF=mailto:$email>$email</A></td></tr>";
if ($web!="" && $web!="http://"):
$www = "<tr><td class=odkaz><A HREF=\"$web\">$web</A></td></tr>";
endif;
$cas = "<tr><td class=cas>" . Date("j. " . "m. " . "Y, " . "H:i:s") . "</td></tr>";

Následuje zpracování textu zprávy. Nejprve zabráníme tomu, aby se vkládaly příliš dlouhé příspěvky. K tomu použijeme funkci SubStr, která vrací část řetězce. První parametr určuje řetězec, druhý pozici prvního znaku a třetí počet znaků. V našem případě ukládáme prvních 1500 znaků. Poté odstraníme funkcí Trim všechny netisknutelné znaky (mezery, konce řádků, …) ze začátku a konce řetězce. Následuje odstranění nebezpečných znaků a nahrazení konců řádků tagy <BR>, což bylo popsáno v minulých dílech.

$zprava = SubStr($zprava, 0, 1500); //bereme pouze 1500 znaku
$zprava = Trim($zprava); //odstraneni mezer z konce retezce
$zprava = HTMLSpecialChars($zprava); //odstraneni nebezpecnych znaku
$zprava = Str_Replace("\n"," <BR> ", $zprava); //nahrazeni koncu radku na tagy <BR>

Nyní rozdělíme dlouhá slova a provedeme detekci odkazů, při čemž budeme využívat regulární výrazy a funkce pro práci s nimi, proto doporučuji předem přečíst tento článek. V proměnné $znak je uložen maximální počet znaků, které slovo může mít. Celý příspěvek nejprve rozdělíme na jednotlivá slova pomocí funkce Split. Následuje cyklus, který se provede přesně tolikrát, kolik je slov. V cyklu nejprve odstraníme pomocí funkce Trim všechny netisknutelné znaky z konce slova.

$znak = 66; //dlouha slova delit po .. znacich
$slovo = Split("[[:blank:]]+", $zprava); //rozdeleni textu na slova
for($y=0;$y<Count($slovo);$y++):
$slovo[$y] = Trim($slovo[$y]); //odstraneni mezer na konci slova

Nyní zjistíme, zda je slovo kratší než $znak, k čemuž použijeme funkci StrLen, která vrací délku řetězce. Pokud ano, mohou nastat tři možnosti - buď se jedná o odkaz začínající na 'www' nebo odkaz začínající na 'http://' a nebo obyčejné slovo, což bude asi nejčastěji. Detekci odkazu provedeme pomocí funkce EregI a regulárního výrazu '("^(www\..+\..{2,3})$', kterému vyhoví slova začínající na na 'www.', dále je nenulový počet libovolných znaků a na konci musí být '.' a národní doména ze 2 nebo 3 znaků. Celý odkaz musíme ještě vložit do tagu <a>, a to pomocí funkce EregI_Replace, která nahrazuje jeden řetězec druhým a při tom využívá regulárního výrazu. Obdobně postupujeme i v případě odkazu, který byl zapsán ve tvaru 'http://'. Jestliže se nejednalo o odkaz, bude obsah proměnné $odkaz totožný s původním slovem. Na závěr spojíme jednotlivá slova do celku a samozřejmě přidáme mezeru, aby slova byla oddělena.

if (Strlen($slovo[$y])<=$znak): //nebudeme delit
if (EregI("^(www\..+\..{2,3})$", $slovo[$y])): //jedna se odkaz typu www...
$odkaz = EregI_Replace("^(www\..+\..{2,3})$", "<a href=http://\\1>\\1</a> ", $slovo[$y]);
elseif (EregI("^(http://.+\..{2,3})$", $slovo[$y])): //jedna se odkaz typu http://
$odkaz = EregI_Replace("^(http://.+\..{2,3})$", "<a href=\\1>\\1</a> ", $slovo[$y]);
else:
$odkaz = $slovo[$y] . " "; //jedna se o normalni slovo
endif;
$celek .= $odkaz; /spojime vsechny slova opet dohromady

Následuje druhá větev podmínky - slovo je delší než $znak. Nejprve si do proměnné $delit uložíme, na kolik částí slovo rozložíme. To provedeme tak, že délku slova vydělíme max. počtem znaků a zaokrouhlíme nahoru pomocí Ceil. V cyklu postupně rozdělujeme dlouhé slovo na části o délce $znak, a to pomocí funkce SubStr, která je popsána výše. Na konec každé části ještě přidáme pomlčku.

else:
$delit = Ceil(StrLen($slovo[$y])/$znak); //delime dlouhe slovo
for($z=0;$z<$delit;$z++):
$cast = SubStr($slovo[$y], $z*$znak, $znak);
$celek .= $cast . " - "; //na konec jednotlivych casti pridame pomlcku
endfor;
endif;
endfor;
//spojime vsechny slova opet dohromady

Jak povolit tagy <b> (tučné písmo) <u> (podtržené písmo) a <i> (kurziva)? Stačí, když znakové entity, které jsme vytvořili funkcí HTMLSpecialChars nyní převedeme na tagy. Vše provádíme funkcí Str_Replace, která nahrazuje jeden řetězec (první parametr) druhým řetězcem (druhý parametr) ve výchozím řetězci (třetí parametr).

//povolime tyto tagy <b> <u> <i>
$zprava = Str_Replace"&lt;b&gt;", "<b>", $celek);
$zprava = Str_Replace("&lt;/b&gt;", "</b>", $zprava);
$zprava = Str_Replace("&lt;i&gt;", "<i>", $zprava);
$zprava = Str_Replace("&lt;/i&gt;", "</i>", $zprava);
$zprava = Str_Replace("&lt;u&gt;", "<u>", $zprava);
$zprava = Str_Replace("&lt;/u&gt;", "</u>", $zprava);

Závěr je stejný jako v minulé verzi - zápis do souboru a přesměrování na kniha.php3, proto ho už nebudu nijak komentovat.

$zprava = "<tr><td class=text><br>$br</td></tr></table><HR color=\"#00008B\">\n";
$write = StripSlashes($name . $e_mail . $www . $cas . $zprava);
if (File_Exists ("book.dat")):
$fp = FOpen ("book.dat", "r");
$data = FRead ($fp, FileSize("book.dat"));
FClose($fp);
endif;
$fp = FOpen ("book.dat", "w");
FWrite ($fp, $write.$data);
FClose ($fp);
?>
<html><head>
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=kniha.php3">
</head></html>

Jak se již stalo zvykem, celou aplikaci si můžete stáhnout zde. Pokud přijdete ještě na nějaké nedostatky nebo vylepšení, určitě napište do diskuse.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.


Reklama


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Diskuse (počet komentářů: 0)

Buďte prvním návštěvníkem, který přidá nový komentář.

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.