it-swarm.com.de

Was ist der reguläre Ausdruck von MM/DD/YYYY und wie verwende ich ihn in PHP?

Ich habe den regulären Ausdruck für MM/DD/YYYY unter http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html gefunden aber ich glaube nicht, dass ich ihn richtig benutze.

Hier ist mein Code:

$date_regex = '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';  
} else {
  echo 'this date is not formatted correctly';  
}

Wenn ich das ausführen, wird immer noch bestätigt, dass "dieses Datum nicht korrekt formatiert" wurde, wenn es das Gegenteil sagen sollte. Wie kann ich diesen regulären Ausdruck in PHP einrichten?

22
zeckdude

Das Problem ist ein Zeichen mit Begrenzungszeichen und Escape-Zeichen (wie bereits erwähnt). Das wird funktionieren:

$date_regex = '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';
} else {
  echo 'this date is not formatted correctly';
}

Beachten Sie, dass ich am Anfang und am Ende des Ausdrucks einen Schrägstrich eingefügt und die Schrägstriche des Musters mit einem Schrägstrich hinterlegt habe.

Um noch einen Schritt weiter zu gehen, wird dieses Jahr das Jahr nicht richtig extrahieren ... nur das Jahrhundert. Sie müssten es in /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)/ ändern, und (wie Jan weiter unten ausgeführt hat), wenn Sie sicherstellen möchten, dass die gesamte Zeichenfolge übereinstimmt (anstelle einer Untermenge), sollten Sie eher etwas wie /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/ verwenden.


Wie andere bereits erwähnt haben, könnte strtotime () die bessere Option sein, wenn Sie nur versuchen, das Datum herauszufinden. Es kann fast jedes gängige Format analysieren und gibt Ihnen einen Unix-Zeitstempel. Sie können es so verwenden:

$test_date = '03/22/2010';

// get the unix timestamp for the date
$timestamp = strtorime($test_date);

// now you can get the date fields back out with one of the normal date/time functions. example:
$date_array = getdate($timestamp);
echo 'the month is: ' . $date_array['month'];    
44
Jeremy Logan

Es ist wahrscheinlich besser, strtotime () zu verwenden, das fast jedes vom Menschen lesbare Datumsformat in einen Unix-Zeitstempel konvertiert. - http://php.net/manual/de/function.strtotime.php

5
DCD

Sie benötigen korrekte Trennzeichen um das Muster herum.

$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~';
5
fuxia

sie können auch die Funktion checkdate () verwenden. Regex braucht nicht.

$str="03/22/2010";
list($mth,$day,$yr)=explode("/",$str);
var_dump(checkdate($mth,$day,$yr));
3
ghostdog74

Regex des Autors der Frage ist fast richtig. Das Datum wird nicht geprüft, weil ein Muster sein sollte:

  pattern="^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|20)\d\d$"

oder wenn Sie Lust haben,

  pattern="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"

Bitte beachten Sie, dass dieses Muster nur für ein Datumsformat und Max/Min-Werte für einzelne Datumselemente prüft. Dies bedeutet, dass der Eintrag eines Benutzers auf Gültigkeit des Datums in der JavaScript-Funktion und/oder auf einem Server überprüft werden sollte (z. B. sollte der 29. Februar nicht zulässig sein, wenn ein Jahr kein Schaltjahr ist).

Als Randbemerkung, wenn Sie eine einzelne Ziffer zulassen möchten (beispielsweise für einen Monat), ändern Sie einen Monatsteil in 

([0-9]|0[1-9]|1[012])

Erläuterung:
[0-9] - eine Ziffer zwischen 0 und 9
oder
0 [1-9] - zwei Ziffern zwischen 01 und 09
oder
1 - zwei Ziffern, begrenzt auf 10, 11, 12

2
azakgaim

Dies prüft gültige Daten von MM/DD/1960 bis MM/DD/2014

Akzeptiert auch Datumsangaben wie M/D/YYYY und 0M/0D/YYYY 

^(?:[1-9]|0[1-9]|1[0-2])/(?:[0-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])/(?:20[6-9][0-9]|20[0-1][0-4])$
1
user1494459

Um diesen Regex zum Überprüfen von Datumsangaben im Code PHP zu verwenden, müssen Sie ihn als Zeichenfolge mit zusätzlichen Regex-Trennzeichen richtig formatieren, da die preg-Funktionen PHP dies erfordern. Sie müssen außerdem Anker hinzufügen, damit die reguläre Ausdehnung der gesamten Zeichenfolge entspricht (oder nicht übereinstimmen kann):

$date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%'; 

$test_date = '03/22/2010'; 
if(preg_match($date_regex, $test_date)) { 
  echo 'this date is formatted correctly';   
} else { 
  echo 'this date is not formatted correctly';   
} 

Natürlich wäre ein Bibliotheksbesuch in dieser Situation besser. Der Regex erlaubt ungültige Daten wie den 31. Februar.

Der reguläre Ausdruck kann nützlich sein, wenn Sie eine Zeichenfolge nach Datumsangaben scannen möchten. In diesem Fall brauchen Sie die Anker nicht. Möglicherweise benötigen Sie noch eine zusätzliche Prüfung, um ungültige Daten auszuschließen. Das hängt davon ab, ob Ihre Eingabe nur gültige Daten enthalten kann oder nicht.

1
Jan Goyvaerts

Ihr Regex braucht Begrenzer:

/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/

0
Amy B

String timeStamp = "03/11/2018 17:51:45";

privates statisches Muster TIMESTAMP_PATTERN = Pattern.compile ("(0 [1-9] | 1 [012])/(0 [1-9] | [1-2] [0-9] | 3 [0-1 ])/" +" ([1-9] [0-9] {3}) ([0-1]? [0-9] | 2 [0-3]): ([0-5 ] [0-9]): ([0-5] [0-9]) ");

private static boolean isTimeStampValid(String timeStamp) {
        boolean isFeb = timeStamp.split("/")[0].matches("(0?[2])");
        if (isFeb) {
            boolean isValidFebDate = timeStamp.split("/")[1].matches("(0?[1-9]|1[1-9]|2[0-8])");
            if (!isValidFebDate) return false;
        }
        return TIMESTAMP_PATTERN.matcher(timeStamp).matches();
    }
0
Yoga Gowda