Ik wil dat een postcode aan de volgende eisen voldoet:
- Het eerste getal mag geen nul zijn, aangezien dit soort postcodes niet bestaan;
- Hierna volgen drie cijfers waarbij de nul wel mag voorkomen;
- Hierna komt precies één spatie (ook al typt een gebruiker geen spatie in of typt een zenuwachtige gebruiker twee of drie spaties, er hoort één spatie te staan);
- Hierna volgen altijd twee hoofdletters.
Dit los ik op de volgende manier op:
<?php
# Kleine letters omzetten naar hoofdletters
$postcode = strtoupper($_POST['postcode']);
# Overbodige spaties verwijderen, zodat er nog maar één overblijft
$postcode = preg_replace("/[[:space:]]{2,}/", " ", $postcode);
if(preg_match('/^[1-9]{1}[0-9]{3}[A-Z]{2}$/', $postcode)){
# Gebruiker heeft geen spatie getypt, dus alsnog toevoegen
$postcode = substr_replace($postcode, " ", 4, 0);
echo "Geldige postcode: $postcode";
}elseif(preg_match('/^[1-9]{1}[0-9]{3}[[:space:]]{1}[A-Z]{2}$/', $postcode)){
# Postcode ziet er precies zo uit zoals ik dat wil
echo "Geldige postcode: $postcode";
}else{
# Postcode voldoet niet aan de voorwaarden
echo "Geen geldige postcode: $postcode";
}
?>
Dit lijkt allemaal goed te werken en dit wil ik nu ook toepassen bij het adres. Probleem is nu dat een adres een variabele lengte heeft. Bij de postcode maakte ik gebruik van...
$postcode = substr_replace($postcode, " ", 4, 0);
...om een spatie op positie #4 toe te voegen. Bij een adres kan ik dat dus niet doen.
Nu dacht ik dit te kunnen oplossen met preg_replace. Een huisnummer bestaat uit minimaal één cijfer. Indien het huisnummer uit één cijfer bestaat, is dit geen nul. Eventuele volgende cijfers kunnen wel een nul zijn. Nu dacht ik het volgende te kunnen gebruiken:
preg_replace("/[1-9]{1}[0-9]*/", "/[[:space:]][1-9]{1}[0-9]*/", $adres);
Blijkbaar mag de tweede parameter geen regular expression zijn. Als ik als adres "Test123III" (een huisnummer kan namelijk ook een toevoeging hebben), krijg ik namelijk als resultaat "Test/[[:space:]][1-9]{1}[0-9]*/III", in plaats van "Test 123III" dat ik verwachtte te krijgen.
Weet iemand een oplossing? Ik kan natuurlijk ook een apart invuldveld maken voor het huisnummer, maar kan het ook zonder aparte velden te gebruiken?