2016-08-03 4 views
2

Ich brauche eine Vielzahl von Datumsstempel in einer Textzeichenfolge mit zerofill in Tag/Monat Spiel datastamp mehrere Varianten mit zerofill, ohne etc

$date_day_pattern = '0[1-9]|[12][0-9]|3[01]'; 
$date_month_pattern = '0[1-9]|1[0-2]'; 
$date_year_pattern = '[12][0-9]|20[12][0-9]'; 

$date_pattern = "(?<!\d)($date_day_pattern)[^\d]?($date_month_pattern)[^\d]?($date_year_pattern)(?!\d)"; 
preg_match("/$date_pattern/m", $input, $matches); 

Dies funktioniert

Muster entsprechen, wenn für

passende
01-05-2015 
01-05-15 
01052015 
010515 

Aber ich muss auch für Datumsstempel übereinstimmen, wo Tag/Monat nicht Null hat. Aber dann muss der Zeitstempel hat eine seperator zwischen Tag, Monat und Jahr

1-5-2015 

Das Muster muss nicht Spiel

152015 

Antwort

2

Sie könnten eine zusätzliche Alternative zu den ersten beiden Ausdrücke hinzufügen:

  • Für den Tag Muster: [1-9](?=\D)
  • Für den Monat patte rn: (?<=\D)[1-9](?=\D)

Dies wird:

$date_day_pattern = '0[1-9]|[12][0-9]|3[01]|[1-9](?=\D)'; 
$date_month_pattern = '0[1-9]|1[0-2]|(?<=\D)[1-9](?=\D)'; 
$date_year_pattern = '[12][0-9]|20[12][0-9]'; 

$date_pattern = "(?<!\d)($date_day_pattern)\D?($date_month_pattern)\D?($date_year_pattern)(?!\d)"; 

Die oben wird sogar seltsam passen, aber nicht mehrdeutig Strings wie:

2-0116 

... aber es wird nicht zulassen, dass:

201-16 

Beachten Sie, dass \D entspricht [^\d].

+0

so '(? =)' Ist eine Art von Look-Ahead? – clarkk

+0

und das gleiche mit '(? <=)' Ein Blick zurück? – clarkk

+0

In der Tat, Sie haben es festgesteckt: Positiv nach vorne schauen und nach hinten schauen. – trincot

1

Sie können conditional subpattern feature dafür verwenden, d. H. Wenn die führende 0 übereinstimmt, machen Sie das Trennzeichen optional, andernfalls machen Sie es obligatorisch.

$date_pattern = 
'(?<!\d)((0)?[1-9]|[12][0-9]|3[01])(?(2)\D?|\D)(0?[1-9]|1[0-2])(?(2)\D?|\D)([12][0-9]|20[12][0-9])(?!\d)'; 
  • Optional Captured Gruppe 2 ist (0)?
  • (?(2)\D?|\D)\D optional macht, wenn die Gruppe # 2 abgestimmt ist sonst \D (nicht-stellig) erforderlich ist.

RegEx Demo

Verwandte Themen