Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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řevod na pomlčky
localhost

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 VypisClankuKon­troler, 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:

CamelCase a snake_case
localhost

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:

Generování hesel
localhost

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 513x (4.18 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Knihovna StringUtils pro práci s textem v PHP
Všechny články v sekci
Knihovny pro PHP
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 4.-5. lekci knihovny v PHP
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
21 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity