phpbar.de logo

Mailinglisten-Archive

[php] regexp Stunde im 24 Stuxnden Format

[php] regexp Stunde im 24 Stuxnden Format

Maik Ryssel maik at laubegaster.de
Fre Okt 20 12:56:19 CEST 2006


Christoph Kramesch schrieb:

>Maik Ryssel schrieb:
>  
>
>>Hallo,
>>
>>$string = "22:23:45"   // Time
>>preg_match("/^([01]{0,1}\d|2[0-3]):(0\d|[1-5]\d):(0\d|[1-5]\d)/",$string,$matches);
>>
>>  
>>    
>>
>Mein Ansatz wär da mal ein ganz anderer.. ein explode mit ":" als 
>Trenner, dann müssen alle Werte numerisch sein, der Erste zwischen 
>0..24, der 2. und 3.  zwischen 0..60
>
>  
>
Ok, benutze jetzt eine Mischung aus RegExe und Vergleich...
Es geht grundsätzlich darum eine Datumsangabe inkl. Zeitangbe in ihre 
Einzelteile zu zerlegen und nur korrekte Datums/Zeiteingaben zuzulassen. 
Es soll aber sowohl Angaben mit und ohne führende "0" unterstützt werden.

Hab es jetzt so gelöst:

define('RGX_YEAR','([1-9]\d{3})');
define('RGX_MONTH','(\d{1,2})');
define('RGX_DAY','(\d{1,2})');
define('RGX_HOUR','(\d{1,2})');
define('RGX_MIN','(\d{1,2})');
define('RGX_SEC','(\d{1,2})');
define('RGX_TIME',RGX_HOUR.':'.RGX_MIN.':'.RGX_SEC);

$string = '2006-10-32 23:31:46';

preg_match('?^'.RGX_YEAR.'-'.RGX_MONTH.'-'.RGX_DAY.'\s+'.RGX_TIME.'$?',$string,$matches);

$day  = (0 < (int) $matches[3] && 31 >= (int) $matches[3] ? (int) $matches[3] : false);
$month = (0 < (int) $matches[2] && 12 >= (int) $matches[2] ? (int) $matches[2] :false);
$year = $matches[1]; 
$hour = (24 >= (int) $matches[4] ? (int) $matches[4] : false);
$min  = (60 >= (int) $matches[6] ? (int) $matches[5] : false);
$sec  = (60 >= (int) $matches[6] ? (int) $matches[6] : false);

echo "<pre>";
var_dump($year);
var_dump($month);
var_dump($day);
var_dump($hour);
var_dump($min);
var_dump($sec);
echo "</pre>";

$string = trim($string);

Würd mich natürlich über Anregunge zur Verbesserung/Optimierungsvorschläge freuen

Maik




php::bar PHP Wiki   -   Listenarchive