PHP: převod data z 2007-08-29 na 29. srpen 2007
Zdravím,
nikde jsem tu nenašel odpověď na můj dotaz, tak zkusím nové téma...snad to tu pomůže i někomu jinému.
Pokouším se vytvořit si funkci pro převod z data 2007-08-29 na 29. srpen 2007, můj návrh:
function convert_date($date) {
// ošetření
if ( !ereg("[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2 }",$date) ) return false;
else {
// získání českého měsíce
$months = array( 01 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec' );
$mesic_cislo = ereg_replace("^([[:digit:]]{4})-0?([[:digit:]]{1,2 })-0?([[:digit:]]{1,2})$","\\2",$date);
$mesic = $months[$mesic_cislo];
// převod data
$date = ereg_replace("^([[:digit:]]{4})-0?([[:digit:]]{1,2 })-0?([[:digit:]]{1,2})$","\\3. $mesic \\1",$date);
// vrácení hodnoty
return $date;
}
}
Kód "prasečina", myslím, že by to šlo nějak zjednodušit pomocí preg_replace(), bohužel ji neumím používat, zkoušel jsem něco jako níže uvedený příklad, bohužel skončil chybou:
function convert_date($date) {
// ošetření
if ( !ereg("[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2 }",$date) ) return false;
else {
// české měsíce
$months = array( 01 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec' );
// převod
$date = preg_replace("^(\d{4})\\-0?(\d{1,2})\\-0?(\d{1,2}) $","\\3. $months[\\2] \\1",$date);
// vrácení hodnoty
return $date;
}
}
Mám ve zvyku za sebou nechávat co nejlepší kód, vím, že to musí jít přes preg_replace(), neví někdo jak ?
Kde najdu více info o funkci preg_replace() v češtině ?
Díky moc za odpovědi
Asi bych se ereg_replace i preg_replace vyhnul, i když to je možná efektivní, ale zase se snadno udělá chyba a není na první pohled zřejmé, jak to funguje...
Jinak mrkni třeba sem: http://php.vrana.cz/prevod-data-z-ceskeho-formatu.p hp
Je to v podstatě řešený ten převod, na jaký ses ptal, jen opačně.
Supr, tak nějak jsem si to představoval, to je mnohem lepší.
Použil jsem to od Hosta, jednoduché, přehledné a se vstupní hodnotou.
Dík za obě odpovědi, snad to tu ještě někomu pomůže když bude hledat.
Do té doby, než sem napíše řešení los.
No los je dobrý, ale myslíš, že to jde ještě efektivněji?
Ale jo, myslím, že by kód šel o něco více zestručnit nebo na převod použít jinou funkci, třeba ten regulární výraz a podobně. Ale bavit se o efektivitě u takového typu kódu je asi bezpředmětné.
Jo, to jo, já to předtím řešil ještě pomocí explode('-',$date), ale to je řekl bych dost amatérské, když má PHP lepší funkce jako je třeba to date(), co jsi použil, nebo ty regulární výrazy.
Jo jinak vím, že PHP trošku pomaleji parsuje řetězec v uvozovkách, tak jsem tam hodil radši apostrofy, ale to je detail.
Nevíš prosím, kde bych našel něco víc o preg_replace() ? Hraju si na svém webu a u každého článku mi funkce rozpozná odkazy. Tady jsem našel zajímavý článek, ereg_replace není tak dobrá, a naučit se tu preg.. mi přijde celkem zajímavé.
Jo, pomocí explode to taky jde, je to asi o jeden řádek kratší...
Na popis funkcí je nejlepší originál PHP manuál... V češtině bys něco našel třeba na Intervalu.
http://interval.cz/clanky/perl-compatible-regularni -vyrazy-v-php-subvyrazy-a-zpetna-reference/
http://www.regularnivyrazy.info/php-pcre-perl-compa tible.html
//edit: v mém prvním příspěvku jsem měl chybu - opravil jsem řádek s přiřazením proměnné $month
Ok, dík za link, manuál pročtu až když budu něco umět.
Jinak to - $months[$date[1]*1] - tos vyřešil dobře, nevěděl jsem jak se zbavit té nuly na začátku jinak než přes ereg_replace, dík.
Ale ta první verze je lepší ne? explode se mi tady moc nelíbí.
Jo a té chyb jsem si všiml těsně před tím, než jsem to přečetl, všude jsem měl srpen