preg_match
Ik wil 2 dingen controleren.
ze kunnen een datum en een tijd invoeren.
ik wil graag kijken of het goed ingevoerd wordt door middel van preg_match.
Maar hoe moet ik dit doen..?
Bedankt.
Greets Mitch
Tja, dat ligt ook maar net aan welk formaat jij wilt dat binnenkomt.
Tijd: HH:ii
checkdate-functie. Deze bepaalt of een datum ook werkelijk bestaat (zoals 30 februari nooit zal voorkomen...)
Ook misschien handig om te kijken naar de Ik gebruik altijd dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/**
* checkDate()
*/
public static function checkDate( $f_szDate, $format = 'y-m-d' )
{
if ( !$format ) $format = 'y-m-d';
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>\d{4})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';
if ( !preg_match($regexp, $f_szDate, $parrMatch) ) {
return false;
}
$szDate = $parrMatch['year'] . '-' . str_pad((int)$parrMatch['month'], 2, '0', STR_PAD_LEFT) . '-' . str_pad((int)$parrMatch['day'], 2, '0', STR_PAD_LEFT);
return $szDate;
} // END checkDate() */
?>
/**
* checkDate()
*/
public static function checkDate( $f_szDate, $format = 'y-m-d' )
{
if ( !$format ) $format = 'y-m-d';
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>\d{4})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';
if ( !preg_match($regexp, $f_szDate, $parrMatch) ) {
return false;
}
$szDate = $parrMatch['year'] . '-' . str_pad((int)$parrMatch['month'], 2, '0', STR_PAD_LEFT) . '-' . str_pad((int)$parrMatch['day'], 2, '0', STR_PAD_LEFT);
return $szDate;
} // END checkDate() */
?>
-- edit
Wat ie doet is een string nemen en die het SQL datum formaat geven (YYYY-MM-DD). Als er niet zo'n formaat van te maken valt (bijv "aap" lijkt er niet geneog op) geeft ie False terug, anders die mooie datum.
Obviously als je altijd hetzelfde input formaat gebruikt, kan er een stukje uit, maar ik vind het wel fijn om achter de hand te hebben: misschien geef je de gebruiker (?) later de keus om hun input formaat te kiezen, of laat je het afhangen van een omgevingsvariabele (zoals taal of club of land oid).
-- edit
Voor de duidelijkheid: de input wordt gecontroleerd met de volgende (standaard) regexp:
#^\d\d?-\d\d?-\d\d\d\d$#
^ betekent 'begin van de string'
$ betekent 'einde van de string'
een \d is een digit, dus zelfde als [0-9]
Gewijzigd op 17/09/2010 23:30:27 door rudie dirkx
Rudie dirkx op 17/09/2010 23:25:32:
checkdate() zuigt. 0000-00-00 is namelijk ook een geldige datum (vind ik dan).
Oh leuk, jij vind dat 0000-00-00 een geldige datum is? Dus 2010-00-01 is ook een geldige datum?
NEE. NEE, dat is het niet. Er *is* geen 0e maand, er is geen 0e dag, en er is geen jaar 0. De telling A.D. begint bij het jaar 1, niet bij het jaar 0.
Alsjeblieft, ga eens wat nalezen, je kraamt complete onzin uit.
Ik vond checkdate() een verschrikkelijk irritante functie, omdat je soms niet weet in welke maand je zit, maar wel de laatste dag ervan wil hebben (om te vergelijken, niet om op te halen om bijv met date() te printen). De laatste dag van de maand is 31, dus dat is makkelijk. En dan kan je makkelijk vergelijken:
Bijv [jouw datum] moet <= "2010-02-31". Die tweede datum zou dan uit een formulier ofzo komen (weetikveel) en dan wil je wel dat het formaat klopt (YYYY-MM-DD dus), maar het hoeft niet perse een bestaande datum zijn.
Rustig maar Richard :) Alles komt goed. 31 februari bestaat nog steeds niet.
Als je het gebruikt als vervanging voor wat NULL is, gebruik dan NULL.
En over je andere punt: daar is checkdate helemaal niet voor. checkdate heeft een enkel simpel doel: een datum valideren. Alle andere dingen die je wilt kan met strtotime, DateTime enzovoorts.
Als je de inhoud van de datum belangrijk vindt (en altijd hetzelfde YYYY-MM-DD formaat gebruikt), is checkdate perfect. Anders niet. Mee eens?
Toevoeging op 18/09/2010 01:27:14:
Mitchel, welke functie je ook gaat gebruiken, stop m aub sowieso in een andere functie, want je wil niet de SPL functie checkdate() gaan gebruiken en er over een jaar achterkomen dat ie niet goed is en dan OVERAL in je code die functie gaan vervangen. Ook al ga je checkdate gebruiken, doe het dan zo(iets):
Code (php)
voor tijd zou ik een 24 uur formaat afdwingen en sec achterwege laten (maar misschien heb je die nodig!?):
Code (php)
1
2
3
4
5
2
3
4
5
<?php
function CheckUserSubmittedTimeFomat( $time ) {
return 0 < preg_match('/^\d\d?:\d\d$/', (string)$time);
}
?>
function CheckUserSubmittedTimeFomat( $time ) {
return 0 < preg_match('/^\d\d?:\d\d$/', (string)$time);
}
?>
Dan zijn 23:00 en 23:77 en 8:41 en 0:02 geldig, maar 14 en 100:00 niet.
Gewijzigd op 18/09/2010 01:30:45 door rudie dirkx
Code (php)
Ja; dit is in mijn ogen doelloos...
Kunnen we niet een limit er op zetten van 24 op de uur en 60 op de minut?
als ik dit doe:
Code (php)
1
2
3
4
5
2
3
4
5
$start_date = '14-09-2010';
echo DateStamp($start_date);
echo '<hr>';
$start_date1 = '114-09-2010';
echo DateStamp($start_date1);
echo DateStamp($start_date);
echo '<hr>';
$start_date1 = '114-09-2010';
echo DateStamp($start_date1);
dan komt er helemaal niet uit (behalven de lijn dan<hr>)
Maar de date-functies van PHP zijn relatief traag en kunnen minder dan de SQL-functies op dit gebied.