webForumDet fria alternativet

preg_match och datum som inte lirar

PHP

7 svar · 1 637 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tja

Har följande:

if(isset($hash['born_from']) && isset($hash['born_to']) && preg_match("/^(19|20[0-9{2}]+)-([0-9{2}]+)-([0-9{2}]+)$/", $hash['born_from']) && preg_match("/^(19|20[0-9{2}]+)-([0-9{2}]+)-([0-9{2}]+)$/", $hash['born_to'])){
	$born_from = $hash['born_from'];
	$born_to   = $hash['born_to'];
}

Men.. den accepterar inte datum som ligger före år 2000 av någon anledning. Någon som kan tala om vad jag gör för fel?

Tack!

Medlem sedan juni 20019 519 inlägg
#2

du säger att den skall matchar på 19 eller 20xx:

$dateMatchPattern = "/^((?:19|20)[0-9{2}]+)-([0-9{2}]+)-([0-9{2}]+)$";

if(isset($hash['born_from']) && isset($hash['born_to']) && preg_match($dateMatchPattern, $hash['born_from']) && preg_match($dateMatchPattern, $hash['born_to'])){
    $born_from = $hash['born_from'];
    $born_to   = $hash['born_to'];
}

borde fungera bättre

Medlem sedan feb. 20034 441 inlägg
#3

Hmm, fungerar inte:

$yearPattern = "/^((?:19|20)[0-9{2}]+)-([0-9{2}]+)-([0-9{2}]+)$";
if(isset($_POST['born_from']) && isset($_POST['born_to']) && preg_match($yearPattern, $_POST['born_from']) && preg_match($yearPattern, $_POST['born_to'])){
	$born_from = safesql($_POST['born_from']);
	$born_to = safesql($_POST['born_to']);
}

Mina datum är i formatet yyyy-mm-dd.

Medlem sedan juni 20019 519 inlägg
#4

Det kan inte ha fungerat alls bra innan:

^((?:19|20)[0-9]{2})-(\d{2})-(\d{2})$

tog bort [0-9{2}] vilket inte alls är det du tror det är att den matchar två nummer, du skrev att den skall matchar 0-9, { och } minst en gång (+).

Medlem sedan feb. 20034 441 inlägg
#5

Nja, din fungerar på samma sätt som den jag hade från början, endast datum större än 1999-12-31 fungerar.

Medlem sedan juni 20014 290 inlägg
#6

Denna kod fungerar:

<?php

$strang="Date is 2932-03-02 someday";

$pattern="/[1-2]\d{3}-[0-1]\d-[0-3]\d/";

preg_match($pattern, $strang, $matches);

print_r($matches);

?>

Den fungerar för åren 1000 - 2999.

Medlem sedan juni 20019 519 inlägg
#7
^((?:19|20)[0-9]{2})-(\d{2})-(\d{2})$

matchar korrekt få ut om jag skriver: 1980-01-31
1 => 1980
2 => 01
3 => 31

så det förstå jag inte varför det inte skulle fungera för dig.

Medlem sedan feb. 20034 441 inlägg
#8

...ledsen att jag är en idiot... felet fanns i en klass och jag ändrade bara på ett ställe hela tiden, ditt första förslag fungerar helt säkert lika bra som dom andra.

Får skylla på att det är midnatt och jag är trött :)

Tack!

293 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
155 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)