2016-08-25 1 views
4

Ich habe dieses gültiges Datum zu ersetzen:ungültiges Datum zu erhalten und preg_replace es

$date = preg_replace('~(\d{2})/(\d{2})/(\d{2,4})~', '', $date); 

So Daten wie folgt aus: 2016.08.25 werden ersetzt.

Mein Problem ist, manchmal Benutzer schreiben Daten wie folgt aus:

082/5/2016 
0825/2016 
08/252/016 
08/25/201 
0/85/2016 

Ich möchte dies auch bekommen können. Irgendwelche Ideen?

+2

Warum nicht eine Nachricht zurück, die sie nicht in einem gültigen Datumsformat gelegt haben? – Daan

+0

@Daan ist es für alte Daten, ich möchte die Datenbank scannen und ersetzen. Für neue Werte mache ich es! –

+0

Wie werden Sie die Daten mit Tippfehlern korrigieren? Z.B. "0/85/2016" könnte "08/15/2016", "08/05/2016", "07/25/2016" usw. sein. Tauschen Sie hoffentlich eine Datumsspalte aus, damit ungültige Daten nicht ausgefüllt werden ? – chris85

Antwort

2

Falls Sie „Strings wie Daten“ in Ihrem Eingang haben, können Sie einen regulären Ausdruck mit einem positiven Lookbehind die Ziffern verwenden, um sicherzustellen kann und Slashes chunk 7 bis 8 Ziffern enthält und dann folgte eine Wortgrenze:

'~\b(?=(?:\D*\d){7,8}\b)\d+(?:/\d+)+\b~' 

Siehe regex demo.

Einzelheiten:

  • \b - führende Wortgrenze
  • (?=(?:\D*\d){7,8}\b) - ein Vorgriffs-erfordert, daß die Wortgrenze mit 7 bis 8 Ziffern mit einem beliebigen Menge von nicht-Ziffern getrennt folgt
  • \d+ - 1 oder mehr Ziffern
  • (?:/\d+)+ - 1 oder mehrere Folgen / + 1 oder mehr Ziffern
  • \b - nachlaufende Wortgrenze.

PHP demo:

$str = "Text containing \n082/5/2016\n0825/2016\n08/252/016\n08/25/201\n0/85/2016\n08/25/2016"; 
$result = preg_replace('~\b(?=(?:\D*\d){7,8})\d+(?:/\d+)+\b~', "", $str); 
echo $result; 
+0

es ist wirklich schön, nur die '0/85/2016' wird immer noch nicht ersetzt. –

+1

'0/85/2016' wird entfernt, überprüfen Sie die Eingabe und Ausgabe im Snippet. –

2

Ich würde den Datumsbereich mit strtotime statt einer Regex validieren.

$array = array('082/5/2016', '0825/2016', '08/252/016', '08/25/201', '0/85/2016', '08/25/2016'); 
foreach($array as $key => $date) { 
    if(!strtotime($date)) { 
     unset($array[$key]); //or handle the invalid date however you want 
    } 
} 
print_r($array); 

Demo: https://eval.in/628649

+0

es scheint nett zu sein! Kann ich in dieses Array Daten mit Worten eingeben? zB: 'Heute ist 082/5/2016' wird es funktionieren? –

+1

Nein, die ganze Zeichenfolge muss das Datumsformat sein. 'Die Funktion erwartet eine Zeichenfolge mit einem englischen Datumsformat und versucht, dieses Format in einen Unix-Zeitstempel zu packen. Sind Ihre Daten nicht getrennt? – chris85

Verwandte Themen