5. díl - Dokončení knihovny StringUtils v PHP

PHP Knihovny Dokončení knihovny StringUtils v PHP American English version English version

V minulém dílu našeho seriálu tutoriálů o tvorbě knihoven pro PHP jsme rozpracovali knihovu StringUtils pro práci s textovými řetězci. Dnes knihovnu dokončíme.

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 pomlčku).

public static function hyphenize($text)
{
        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:

PHP knihovna StringUtils – Převod na pomlčky

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 CamelCase.

Tyto konvence nejsou žádné dogma a mnoho lidí si je úzpů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

CamelCase je někdy chápán 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($text, $separator, $uncapitalize = true)
{
        $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($text, $separator)
{
        return ltrim(mb_strtolower(preg_replace('/[A-Z]/', $separator . '$0', $text)), $separator);
}

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 false.

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í 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($text, $uncapitalize = true)
{
        return self::convertToCamel($text, '-', $uncapitalize);
}

public static function snakeToCamel($text, $uncapitalize = true)
{
        return self::convertToCamel($text, '_', $uncapitalize);
}

public static function camelToHyphens($text)
{
        return self::convertFromCamel($text, '-');
}

public static function camelToSnake($text)
{
        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:

PHP knihovna StringUtils – Převody mezi CamelCase a snake_case

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($from, $to, $length)
{
        $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($addSpecialChar = false)
{
        $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.

Výsledek:

PHP knihovna StringUtils – Generování hesel

Okomentovanou knihovnu StringUtils máte v příloze, ať vám dělám radost :) Příště si vytvoříme knihovnu pro snadné generování HTML kódu.


 

Stáhnout

Staženo 268x (11.13 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

  Aktivity (2)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (8 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Knihovny pro PHP

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!