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.

Žádný příspěvek v diskuzi

Odpovědět