Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [PHP] Altijd één spatie voor het huisnummer  (gelezen 3705 keer)

[PHP] Altijd één spatie voor het huisnummer
« Gepost op: 2009/11/04, 23:47:11 »
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" "40);
    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?
« Laatst bewerkt op: 2009/11/05, 17:11:33 door Linux-user »

Offline track

  • Lid
Re: [PHP] Altijd één spatie voor het huisnummer
« Reactie #1 Gepost op: 2009/11/05, 13:53:05 »
Hoi "Linux-user",

ook al heb ik verder geen kennis van PHP toch even enkele opmerkingen:

- als ik dergelijke adressen moet normaliseren (in mijn geval met awk dan) houd ik het opsplitsen
   en het formatteren liefst netjes gescheiden.
   In jouw geval:  eerst huisnummer afsplitsen, daarna normaliseren.
   Denk ook aan rare gevallen zoals "straat van 1-mei 23" !!  -> string beter van rechts parsen.

- bij een "replace" is dat wat je inzet uiteraard geen "regular expression", maar je kunt er wél een soort variabelen inzetten
   (bij awk althans)

- formaat postcode:  mits je niet uitsluitend Nederlandse adressen hebt kloppen jouw veronderstellingen niet.
   B.v.: mijn adres (in D'land) is  "06766 Wolfen".  Dus met "0" het eerste cijfer (van 5), en zonder letters.

track

Re: [PHP] Altijd één spatie voor het huisnummer
« Reactie #2 Gepost op: 2009/11/05, 14:56:18 »
- als ik dergelijke adressen moet normaliseren (in mijn geval met awk dan) houd ik het opsplitsen
   en het formatteren liefst netjes gescheiden.
   In jouw geval:  eerst huisnummer afsplitsen, daarna normaliseren.
   Denk ook aan rare gevallen zoals "straat van 1-mei 23" !!  -> string beter van rechts parsen.

Goed punt, inderdaad.

- bij een "replace" is dat wat je inzet uiteraard geen "regular expression", maar je kunt er wél een soort variabelen inzetten
   (bij awk althans)

Ik zal nog eens het één en ander doorlezen. Eens kijken of het me dan wel lukt.

- formaat postcode:  mits je niet uitsluitend Nederlandse adressen hebt kloppen jouw veronderstellingen niet.
   B.v.: mijn adres (in D'land) is  "06766 Wolfen".  Dus met "0" het eerste cijfer (van 5), en zonder letters.

Klopt. Daar heb ik dan ook rekening mee gehouden. Er wordt namelijk eerst gekeken welk land is geselecteerd vanuit een dropdown-menu en aan de hand daarvan wordt de opmaak van dat land gekozen. Bovenstaande code is dus alleen van toepassing als bij "Land" is gekozen voor Nederland.

[EDIT]
Het resultaat is inderdaad te vinden onder variabele $0. In plaats van "/[[:space:]][1-9]{1}[0-9]*/" had ik dus gewoon " $0" moeten typen.

Ik ga nu nog even kijken wat er gebeurt met "straat van 1-mei 23". Het probleem uit de startpost is in ieder geval opgelost. Bedankt voor je hulp. :)
[/EDIT]
« Laatst bewerkt op: 2009/11/05, 15:12:33 door Linux-user »

Re: [OPGELOST][PHP] Altijd één spatie voor het huisnummer
« Reactie #3 Gepost op: 2009/11/05, 16:36:56 »
Het werkt toch niet helemaal naar behoren. Wat ik ook probeer, hij weigert het verschil te zien tussen geen spatie en één spatie. Bij het gebruik van...
/[[:space:]]{2,}/
...kan ik twee spaties of meer terug brengen naar één spatie. Als er voor een huisnummer geen spatie staat, moet een spatie komen te staan. Na de aanpassing uit mijn vorige post gebeurt dat ook. Probleem is nu dat als er al een spatie staat, er alsnog een extra spatie wordt toegevoegd. Nu heb ik al van alles geprobeerd, zoals:
if(preg_match("/[[:space]]{0}[1-9]{1}[0-9]*/", $adres)){
    echo "Geen spatie: $adres<br />";
    echo preg_replace("/[1-9]{1}[0-9]*/", " $0", $adres);

if(preg_match("/[[^:space:]][1-9]{1}[0-9]*/", $adres)){
    echo "Geen spatie: $adres<br />";
    echo preg_replace("/[1-9]{1}[0-9]*/", " $0", $adres);

if(preg_match("/\S[1-9]{1}[0-9]*/", $adres)){
    echo "Geen spatie: $adres<br />";
    echo preg_replace("/[1-9]{1}[0-9]*/", " $0", $adres);

if(preg_match("/[^\s][1-9]{1}[0-9]*/", $adres)){
    echo "Geen spatie: $adres<br />";
    echo preg_replace("/[1-9]{1}[0-9]*/", " $0", $adres);

if(preg_match("/[^ ][1-9]{1}[0-9]*/", $adres)){
    echo "Geen spatie: $adres<br />";
    echo preg_replace("/[1-9]{1}[0-9]*/", " $0", $adres);

Bij ze allemaal wordt er ook een spatie toegevoegd als er voor het huisnummer al een spatie staat. Ik dacht dat ik bij alle vijf de versies alleen een match zou krijgen als er geen spatie voor het huisnummer zou staan. Wat zie ik over het hoofd?

Offline track

  • Lid
Re: [OPGELOST][PHP] Altijd één spatie voor het huisnummer
« Reactie #4 Gepost op: 2009/11/05, 17:18:01 »
Bij awk zou ik een  gsub(" +"," ",$0)  doen.  (syntax: gsub(van,naar,var) )
en dat als laatste stap.  Dan wordt telkens iedere reeks spaties (v.a. 1) door éénje vervangen.

Anders kun je ook de componenten (bij awk althans) gewoon achter elkaar laten zetten:
output= postcode, stad, straat, nummer;(er wordt telkens automatisch een spatie tussen gegezet)

track
« Laatst bewerkt op: 2009/11/05, 17:20:12 door track »