2010-12-02 18 views
0

Ich habe Textarea wo Benutzer Details eingeben, ich möchte Jahr aus dem Textfeld extrahieren. Das Problem besteht darin, dass Benutzer das Jahr auf verschiedene Arten eingeben.So extrahieren Jahr mit preg_match

Einige Benutzer geben Daten als 1999 oder '99 oder september 99 ein. Wie kann ich eine einzelne Regex-Zeichenfolge verwenden, um Jahr zu extrahieren.

+1

... und sind sie nicht zufällig auch Tage und Monate in den gleichen 'textarea' Eingabe? –

+0

@tim Kein Tag sicher. Während einige Monate wie Sep'99 oder September '99 verwenden. –

+3

Dies ist tangential zur Frage, aber wenn es die Möglichkeit gibt, dass Informationen beim Eingeben verwirrend sind, ist das Problem ** schlechtes Benutzeroberflächen-Design **. Sie sollten die Eingabemethode so ändern, dass die Jahrangabe eindeutig ist. –

Antwort

2

Dies sollte zum Extrahieren der genannten Daten arbeiten nicht vorhanden:

Das kam mir in den Sinn, auch (es gibt dem Benutzer ein wenig mehr Freiheit):

preg_match_all('/(^|\s+)((january|february|march|april|may|june|july|august|september|october|november|december|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)?(\s|\s?\')(\d{2}|\d{4}))(\s+|$)/i', $text, $matches); 

alle oben genannten wäre einfacher, wenn Sie mit mehreren Ausdrücken analysiert. Warum brauchst du einen einzigen?

Wenn Sie nur eine Zeichenfolge parsen möchten, die nichts anderes enthält, sollten Sie PHP strtotime()-function verwenden.

+1

+1 für eine Lösung, die genau der Spezifikation folgt. Ziemlich sicher, dass die Spezifikation unvollständig ist, obwohl :) Hey, ich habe 'Feb 99' eingegeben! Es funktioniert nicht! –

0
\b\d\d(?:\d\d)?\b 

entspricht einer zwei- oder vierstelligen Zahl. Wenn Ihre Zeichenfolge nur Jahreszahlen enthält, sollte das ausreichen.

if (preg_match('/\b\d\d(?:\d\d)?\b/', $subject, $regs)) { 
    $result = $regs[0]; 
} 
0

Sie können versuchen, strtotime zu verwenden:

strtotime - Analysiert jede in englischer Textdatetime Beschreibung in einen Unix-Zeitstempel

date('Y', strtotime($userinput)); 
0
[. -]((?:\d\d|')\d\d)$ 
0

Extract nur Ziffern von Ihrem string:

/\b(\d+)\b/