preg_match --> pattern

Steusi

Nasenbär
Hallo Leute ich bekomme die Funktion preg_match einfach nicht umgesetzt. Ich habe sie sonst auch nur zur Kontrolle der Mail-Adresse benutzt und da findet man genug im Web, nun wollte ich aber selbst eine Regel verfassen, klappt aber nicht.

Folgendes soll erlaubt sein:

2009-1-2
2009-01-02

Also
1. Zeichen: [1-2]
2. Zeichen: [0-9]
3. Zeichen: [0-9]
4. Zeichen: [0-9]
5. Zeichen [-]
6. Zeichen [1-9]
7. Zeichen [1-9] oder [-]
8. Zeichen [1-9] oder [-]
9. Zeichen [1-9] oder [-]
10. Zeichen Zeichen [1-9] oder [-]

oder so Ähnlich, aber dem 7. Zeichen bin ich mir nicht sicher.
Hoffe jemand kann mir sagen wie man es anlegt.

ich habe folgendes versucht:
PHP:
$pattern = '/^([1-2])([0-9])([0-9])([0-9])([-]))([1-9])([*])';

if((preg_match ($pattern, $_POST['wunsch1'])) or (preg_match ($pattern, $_POST['wunsch2']))) {
				echo ("JA");
			} else {
				echo ("NEIN");
			}
 
Ich würd’s etwa wir folgt machen:
PHP:
function checkDate($date)
{
	 return preg_match('/^[1-2]\d\d\d-\d{1,2}-\d{1,2}$/', $date) && strtotime($date);
}
Damit bist du nicht nur sicher ob es syntaktisch richtig ist, sondern auch ob es semantisch richtig ist.
 
Hier meine allgemeine Lösung:

PHP:
<?php
$s = "2009-1-2";
$pattern = "/(\d*)-(\d*)-(\d*)/";

preg_match($pattern, $s, $arr);

if (1000 < $arr[1] &&
	$arr[1] < 2999 &&
	$arr[2] < 99 &&
	$arr[3] < 99) {
		
	echo "VALID";
		
}
?>

Mit dem kann man die Grenzen auch festlegen. Der von Gumbo kann das auch und ist kürzer.
 
@ Gumbo, was gibt mir die Funktion zurück? true or false?

Zudem kommt die Meldung:
Code:
Fatal error: Cannot redeclare checkdate()

Es handelt sich um eine Benutzereingabe, ich will nur wissen ob er es richtig eingibt.

@ZodiacXP das ist für mich einfacher nachzuvollziehen.

Klappt auch wunderbar, wie kann ich aber 2 Eingabewörter kontrollieren?
Habe es nicht gerade schön gelöst?
PHP:
			$CheckStr = $Dwunsch1;
			for($i=0; $i<2; $i++) {
				$pattern = "/(\d*)-(\d*)-(\d*)/";
				preg_match($pattern, $CheckStr, $arr);
					
				if (1000 < $arr[1] &&
					$arr[1] < 2999 &&
					$arr[2] < 99 &&
					$arr[3] < 99) {
					$Fehlernummer = 0;	
					// Wenn Dwunsch1 nicht falsch war, wird Dwunsch2 überprüft.	
					$CheckStr = $Dwunsch2;			
				} else {			
					$Fehlerausgabe .= "Geben Sie das Datum bitte in der Form Jahr-Monat-Tag ein, dabei müssen Sie die Bindestriche setzten!<br>";
					$Fehlernummer = 1;
					break;
				}
			
			}
 
Entweder preg_match nochmal anwenden oder in eine Funktion auslagern.

Die Funktion von Gumbo würde ich in diesem Fall nehmen, da sie Boolean (TRUE / FALSE) wiedergibt und perfekt für deine IF ist.
 
Wenn ich die Function 2 mal ausführen lasse, habe ich auch 2mal den Text von $Fehlerausgabe stehen.
Wie gesagt, checkDate() funktioniert nicht. Ich werde nochmal gucken wie ich es besser lösen kann.
Ich danke euch beiden auf jedenfall!
 
Stehe ich auf dem Schlauch?

Also zum Fehler von gerade:
Code:
Fatal error: Cannot redeclare checkdate()

Die Funktion checkDate gibt es schon in PHP allerdings mit anderem Sinn, bzw anderen Grenzen. Daher benenne die Funktion einfach um:

PHP:
function checkDateForm($date)
{
     return preg_match('/[1-2]\d\d\d-\d{1,2}-\d{1,2}/', $date) && strtotime($date);
}

Und es klappt wunderbar für deine doppelte Überprüfung:
PHP:
// Wenn Dwunsch1 nicht falsch war, wird sofort Dwunsch2 geprüft
if (checkDateForm($Dwunsch1) && checkDateForm($Dwunsch2))
  $Fehlernummer = 0;    
else {            
  $Fehlerausgabe .= "Geben Sie das Datum bitte in der Form Jahr-Monat-Tag ein, dabei müssen Sie die Bindestriche setzten!<br>";
  $Fehlernummer = 1;
}
 
Zurück