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"<b>", "<b>", $celek); $zprava = Str_Replace("</b>", "</b>", $zprava); $zprava = Str_Replace("<i>", "<i>", $zprava); $zprava = Str_Replace("</i>", "</i>", $zprava); $zprava = Str_Replace("<u>", "<u>", $zprava); $zprava = Str_Replace("</u>", "</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.