Lekce 5 - Dokončení knihovny StringUtils v PHP
V minulé lekci, Knihovna StringUtils pro práci s textem v PHP, jsme rozpracovali knihovu
StringUtils
pro práci s textovými řetězci.
Dnes si v knihovně StringUtils
zajistíme převod na pomlčky
mezi snake_case a camelCase. Také si vygenerujeme heslo.
Převod na pomlčky
Často potřebujeme např. z názvu článku vytvořit URL nebo z názvu
uživatele emailovou adresu. Za tímto účelem si vytvoříme metodu
hyphenize()
(hyphen označuje v angličtině
pomlčku):
public static function hyphenize(string $text): string { return preg_replace("/\-{2,}/u", "-", preg_replace("/[^a-z0-9]/u", "-", mb_strtolower(self::removeAccents($text)))); }
Metoda ze vstupu odstraní diakritiku a převede ho na malá písmena. Cokoli, co není znak, je dále převedeno na pomlčky. Aby nebyly někde dvě pomlčky vedle sebe, je výstup obalen ještě jedním regulárním výrazem.
Vyzkoušejme:
echo(StringUtils::hyphenize('Programujeme v JavaScriptu objektově') . '<br />'); echo(StringUtils::hyphenize('Jan Novák') . '@nejakaadresa.cz');
Výsledek:
Převody jmenných konvencí
Na každou technologii se váží určité konvence, které bychom měli dodržovat. Např. názvy ID a tříd se v HTML/CSS píší obvykle s pomlčkami, stejně jako URL adresy. Naopak klíče polí v PHP se často píší s podtržítky, stejně jako názvy databázových tabulek a sloupců v MySQL databázi. Názvy tříd v PHP píšeme velbloudí notací (camelCase).
Tyto konvence nejsou žádné dogma a mnoho lidí si je uzpůsobuje (např. mají databázové tabulky nebo HTML identifikátory v camelCase). Někdy je uzpůsobení výhodné, někdy je však lepší mezi různými jmennými konvencemi převádět. Uveďme si jeden příklad za všechny. V našem MVC frameworku zadáváme název kontroleru do URL adresy, která vypadá takto:
http://nejakaadresa.cz/vypis-clanku
PHP si adresu naparsuje a z parametru potřebuje vytvořit instanci třídy VypisClankuKontroler, která požadavek zpracuje. Buď musí adresa vypadat jako:
http://nejakaadresa.cz/VypisClanku
nebo použijeme převodní funkci z pomlček (hyphens) na camelCase, což je čistší a URL potom vypadá jako URL a třída je pojmenovaná jako třída.
camelCase a PascalCase
Notace camelCase je někdy chápána jako jen s malým počátečním písmenem (jako camelCase) a pokud je počáteční velké, označuje se tato notace jako PascalCase. Jistě bychom mohli udělat všechny převodní funkce jak pro camelCase, tak pro PascalCase. Aby však knihovna zbytečně nenakynula, řešil jsem to dobrovolným parametrem u daných funkcí.
Prvně si vytvořme dvě privátní metody:
private static function convertToCamel(string $text, string $separator, bool $uncapitalize = true): string { $result = str_replace(' ', '', mb_convert_case(str_replace($separator, ' ', $text), MB_CASE_TITLE)); if ($uncapitalize) $result = self::uncapitalize($result); return $result; } private static function convertFromCamel(string $text, string $separator): string { return ltrim(mb_strtolower(preg_replace('/[A-Z]/', $separator . '$0', $text)), $separator); }
Metoda convertToCamel()
převede cokoli na CamelCase
pomocí zvoleného separátoru (např. se separátorem -
a textem
vypis-clanku
vrátí VypisClanku
). Nejprve převedeme
separátory na mezery, čímž získáme slova. Díky funkci
mb_convert_case()
můžeme nyní slovům zvětšit první písmeno.
Mezery následně nahradíme za prázdný string
, čím se slova
spojí do jednoho. První písmeno zde ještě převedeme na malé, pokud není
dobrovolný parametr na hodnotě false
.
Metoda convertFromCamel()
naopak převede CamelCase na
řetězec s malými písmeny a se separátory mezi slovy. Velká písmena
pomocí regulárního výrazu předsadíme separátorem, následně řetězec
převedeme na malá písmena a smažeme separátor na začátku řetězce
pomocí funkce ltrim()
.
Základ převodů máme. Nyní si napišme několik veřejných funkcí, které budou tento základ používat:
public static function hyphensToCamel(string $text, bool $uncapitalize = true): string { return self::convertToCamel($text, '-', $uncapitalize); } public static function snakeToCamel(string $text, bool $uncapitalize = true): string { return self::convertToCamel($text, '_', $uncapitalize); } public static function camelToHyphens(string $text): string { return self::convertFromCamel($text, '-'); } public static function camelToSnake(string $text): string { return self::convertFromCamel($text, '_'); }
Podle názvu by mělo být jasné co která metoda dělá. Pojďme si je vyzkoušet:
echo(StringUtils::hyphensToCamel('vypis-vsech-clanku', false) . '<br />'); echo(StringUtils::snakeToCamel('cislo_popisne', false) . '<br />'); echo(StringUtils::camelToHyphens('VypisClanku') . '<br />'); echo(StringUtils::camelToSnake('CisloPopisne') . '<br />');
Výsledek:
Generování hesel
Naši knihovničku dokončeme metodou pro generování hesel. Ta se nám
hodí např. když uživatel své heslo zapomene a my mu chceme vygenerovat
nové. Autorem kódu je sczdavos, vzdejme mu hold
Nejprve si vytvořme pomocnou metodu randomString()
:
private static function randomString(string $from, string $to, string $length): string { $str = ''; if ($length > 1) $str .= self::randomString($from, $to, --$length); return $str . chr(rand(ord($from), ord($to))); }
Metodě zadáme rozsah pomocí dvou znaků (např. A
a
Z
) a délku řetězce. Vrátí řetězec o požadované délce,
který obsahuje ASCII znaky v daném rozsahu. Metodu hned využijeme v již
veřejné metodě generatePassword()
:
public static function generatePassword(bool $addSpecialChar = false): string { $numbers = self::randomString('0', '9', 2); $lowerCase = self::randomString('a', 'z', 2); $upperCase = self::randomString('A', 'Z', 2); $specialChars = array('!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '.', ','); $password = $numbers . $lowerCase . $upperCase; if ($addSpecialChar) $password .= $specialChars[array_rand($specialChars)]; return str_shuffle($password); }
Metoda si připraví několik řetězců (2 čísla, 2 malá písmena, 2
velká písmena) a pokud je dobrovolný parametr true
, tak i
speciální znak). Tyto řetězce poté náhodně spojí do jednoho řetězce
funkcí str_shuffle()
.
Zkusme si vygenerovat několik hesel:
for ($i = 0; $i < 5; $i++) { echo(StringUtils::generatePassword($i > 2) . '<br />'); }
První 3 jsou bez speciálních znaků, další 2 s nimi:
Okomentovanou knihovnu StringUtils
máte v příloze. Ať vám
dělám radost
V následujícím cvičení, Řešené úlohy k 4.-5. lekci knihovny v PHP, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 519x (4.18 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP