ereg Regulärerausdruck

liquidbeats

Erfahrenes Mitglied
Nabend,

kurze Frage. Ich wollte gerne wissen ob mir jemand bzgl. einer Überprüfung Helfen könnte.
Ich habe einen String im folgenden Format 10.02.2007 - 19:15:23, welchen ich mithilfe von ereg überprüfen wollte.

d.m.Y - G:i:s ist das verwendete Datumsformat, welches ich als Standard nutzen wollte.
Das nutze ich gerade
HTML:
([0-9]{2}).([0-9]{2}).([0-9]{4}) - ([0-9]{2}):([0-9]{2}):([0-9]{2})
nur lässt dies auch eingaben wie 09.02.2007 - 19:13:2600 durchrutschen. Weiterhin knn man dann noch irgendwlechgen mist eintragen, wie bspw. 93.12.2010 (93 Tag im Monat Dezember).

Hoffe, mir kann jemand Helfen.

Grüße
 
Es reicht zu prüfen, ob die Eingabe semantisch korrekt ist. PHP hat dafür schon einige Funktionen parat, etwa:
PHP:
($match = sscanf($string, '%u.%u.%u - %u:%u:%u')) && strtotime(sprintf('%u-%u-%uT%u:%u:%u', $match[2], $match[1], $match[1], $match[3], $match[4], $match[5]))
Reguläre Ausdrücke sind meiner Meinung nach für diesen Fall etwas überqualifiziert.
 
Es wäre doch unglaublich langweilig, wenn man schon alles könnte.
Find ich eigentlich weniger. Dann hätte man nicht mehr soviele Konzeptionelle Probleme beim erstellern diverser Scripte und Anwendungen :)

sscanf habe ich mir zwar in der PHPHilfe angeschaut, aber nicht verstanden. printf ist mir ein Begriff, und wenn sscanf änlich sein soll, verstehe ich den zumsammenhang zum Überprüfen nicht so ganz.

Grüße
 
hui, wie geil :D gumbo, du bist gut, kurz knackig und treffend! vielen dank für die Inspiration, ich wette mit den beiden funktionen lässt sich allerhand machen :D
 
Hallo,

Es reicht zu prüfen, ob die Eingabe semantisch korrekt ist. PHP hat dafür schon einige Funktionen parat, etwa:
PHP:
($match = sscanf($string, '%u.%u.%u - %u:%u:%u')) && strtotime(sprintf('%u-%u-%uT%u:%u:%u', $match[2], $match[1], $match[1], $match[3], $match[4], $match[5]))
Reguläre Ausdrücke sind meiner Meinung nach für diesen Fall etwas überqualifiziert.
Die Lösung ist so leider nicht zu gebrauchen, da sie für alle Eingabewerte außer dem leeren String true zurückliefert.

Daher mein Vorschlag:
PHP:
sscanf($string, '%u.%u.%u - %u:%u:%u', $tag, $monat, $jahr, $stunde, $minute, $sekunde) == 6 && checkdate($monat, $tag, $jahr) && checktime($stunde, $minute, $sekunde)
Mit folgender Funktion:
PHP:
function checktime($stunde, $minute, $sekunde) {
	return $stunde >= 0 && $stunde <= 23 &&
		$minute >= 0 && $minute <= 59 &&
		$sekunde >= 0 && $sekunde <= 59;
}

Grüße,
Matthias
 
Hallo,

Dass alle Eingabewerte als als wahr evaluiert werden, ist übertrieben.
Tatsächlich?

PHP:
<?php

function check($string) {
	return ($match = sscanf($string, '%u.%u.%u - %u:%u:%u')) && strtotime(sprintf('%u-%u-%uT%u:%u:%u', $match[2], $match[1], $match[1], $match[3], $match[4], $match[5]));
}

$tests = array(
	"10.02.2007 - 19:15:23",
	"09.02.2007 - 19:13:2600",
	"93.12.2010 - 19:15:23",
	"foobar",
	"tutorials.de",
	42,
	""
);

foreach ($tests as $test) {
	$result = check($test);
	var_dump($test);
	echo "->\n";
	var_dump($result);
	echo "\n";
}

?>
Ergibt bei mir:
Code:
string(21) "10.02.2007 - 19:15:23"
->
bool(true)

string(23) "09.02.2007 - 19:13:2600"
->
bool(true)

string(21) "93.12.2010 - 19:15:23"
->
bool(true)

string(6) "foobar"
->
bool(true)

string(12) "tutorials.de"
->
bool(true)

int(42)
->
bool(true)

string(0) ""
->
bool(false)

Grüße,
Matthias
 
Zuletzt bearbeitet:
Zurück