Regex hulp: valideer NL telefoonnummers inclusief 0900 en 0800

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

23/05/2021 15:35:27
Quote Anchor link
Ik ben enorm slecht in regex en hoop dat er hier een regex guru aanwezig is die mij verder kan helpen. Ik heb een regex nodig die Nederlandse telefoonnummers kan valideren. Op internet zijn deze in overvloed te vinden en heb er dan ook een gevonden die dit doet. Er is alleen een probleem. Het is in mijn geval essentieel dat ook 0900 en 0800 nummers worden toegelaten (het gaat om een site waar telefoonnummers van o.a. huisartsenposten ingevoerd moeten kunnen worden. En deze hebben vaak 0900 of, in enkele unieke gevallen, 0800 nummers maar nagenoeg nooit reguliere vaste nummers). Maar er moeten ook reguliere telefoonnummers mee gevalideerd worden omdat ook telefoonnummers van ziekenhuizen en directe telefoonnummers van ambulancemeldkamers ingevoerd moeten worden. Dus een regex voor alleen 0900 en 0800 zou in dit geval niet werken.

Dit is de regex die ik gevonden heb en getest. Deze lijkt de meest voorkomende schrijfwijzen van Nederlandse telefoonnummers toe te staan:
^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9])((\s|\s?-\s?)?[0-9])((\s|\s?-\s?)?[0-9])\s?[0-9]\s?[0-9]\s?[0-9]\s?[0-9]\s?[0-9]$

Ik hoop dat iemand mij helpen kan want regex is met recht abrakadabra voor mij ;-)
 
PHP hulp

PHP hulp

25/04/2024 09:58:13
 
- Ariën  -
Beheerder

- Ariën -

23/05/2021 15:57:39
Quote Anchor link
Wat is de reden dat je alles in je reg-ex wilt afhandelen? Je kan toch ook een functie maken om het netnummer te controleren?
 

23/05/2021 16:06:08
Quote Anchor link
Ik werk met Codeigniter 4 met een krachtig form validatie systeem. Hier kan ik, als de standaard validatie opties niet voldoende zijn valideren met een regex.
Ik kan ook eigen functies toevoegen, maar om te valideren of het echt om een valide Nederlands telefoonnummer gaat moet ik dan in die functie alsnog een regex er op loslaten. Ander controleer ik alleen op lengte en of her letters oid in zitten, en dat is in dit geval niet voldoende.

Edit: Als ik een optie over het hoofd zie hoor ik het graag ;-) Ik sta altijd open voor verbetering
Gewijzigd op 23/05/2021 16:07:06 door
 
- Ariën  -
Beheerder

- Ariën -

23/05/2021 16:10:24
Quote Anchor link
Je kan ook gedeeltelijk reg-ex's toepassen.
 

23/05/2021 16:18:53
Quote Anchor link
Je bedoeld twee afzondelijke reg-exen? Een voor de "reguliere" telefoonnummers en een die 0800 en 0900 nummers controleert?
 
- Ariën  -
Beheerder

- Ariën -

23/05/2021 16:28:19
Quote Anchor link
Klopt
 
Willem vp

Willem vp

23/05/2021 17:42:14
Quote Anchor link
Deze zou het volgens mij moeten doen (ik heb de originele regex daarnaast iets versimpeld):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
^((\+|00(\s?\-?\s?))31(\s?\-?\s?)(\(0\)[\-\s]?)?|0)([1-7](((\s?\-?\s?)\d)){3}(\s?\d){5}|((800|90[069])(\s?\-?\s?)(\s?\d){4}((\s?\d){3})?))$


De oorspronkelijke regex matcht nummers als:
+31612345678
+31(0)6-12345678
+31-6-12345678
0612345678
06-12345678
020-1234567
0345-123456

(met die tweede ben ik het overigens niet eens, want die (0) mag eigenlijk niet, maar helaas zie je dat best vaak, dus laat ik het maar zo). Overal mogen bovendien spaties tussen zitten. En eigenlijk matcht 'ie ook op een nummer als 06-1-2-345678, maar dat is niet te voorkomen zonder de regex erg veel ingewikkelder te maken. E.e.a. kan trouwens nog een stuk eenvoudiger als naast spaties ook overal streepjes tussen mogen.

Met mijn aanpassing worden ook 0800, 0900, 0906 en 0909-nummers met 8 of 11 cijfers geaccepteerd. Voor het gemak mag dat ook in internationale notatie (dus +31-900-1234567).
 
Ivo P

Ivo P

25/05/2021 11:41:11
Quote Anchor link
Hoe ga je de nummers opslaan?

Ik neem aan dat het wel handig is, om dat op een eenduidige manier te doen.
Dus dat in je database niet alle bovenstaande varianten voorkomen, maar alles staat als

0612345678 of +31612345678

Daarmee kun je dan ook een hoop lucht slaan uit je regex: als je vooraf alles wat geen cijfer is, of een + op de eerste plek verwijdert, hoef je niet op alle plekken die \s? te zetten.

Hoe vervolgens dat nummer in je scherm weer terugziet bij de klantenservice etc. is aan je template. Daar kun je dan er voor kiezen om bijvoorbeeld alle NL nummers toch weer van +31101234567 te tonen als 010-1234567
en een buitenlands nummer dat niet met +31 maar bijv. met +32 staat opgeslagen als zodanig op te slaan.
(en als het met 00 begint, dan maak je daar een + van)

Mocht je het nummer namelijk in gaan zetten om rechtstreeks je telefooncentrale te laten bellen, of om bij binnenkomende telefoontjes een match naar je klant te leggen, dan heb je doorgaans meer aan een eenduidige opslag.


Ik zou daarbij de +31 notatie kiezen. Een klant van me had alles in de 06- notatie staan, maar als je letterlijk zo dicht aan de grens zit dat je magazijn beter bereik heeft op het Proximus netwerk, dan heb je genoeg klanten en personeel met een buitenlands nummer.
 
Michael -

Michael -

26/05/2021 18:21:16
Quote Anchor link
Quote:
Dit is de regex die ik gevonden heb en getest. Deze lijkt de meest voorkomende schrijfwijzen van Nederlandse telefoonnummers toe te staan:
^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9])((\s|\s?-\s?)?[0-9])((\s|\s?-\s?)?[0-9])\s?[0-9]\s?[0-9]\s?[0-9]\s?[0-9]\s?[0-9]$


Ik zou zeggen; doe vooral niet teveel moeite en neem anders de tips van Ivo mee.
Je kunt nooit 100% zeker zijn dat een telefoonnummer juist is ingevuld en je maakt het op deze manier alleen maar lastiger voor de gebruiker.

Hierbij kun je beter denken aan gebruiksvriendelijkheid. Check of het met + of 0 start en laat het daarbij. Als je het perse op 1 manier wilt opslaan, maak dan een dropdown met alle netnummers en verwijder de eerste 0 als ie er is, dan is het nummer altijd goed, maar dat geldt voor 0800/0900 weer niet.

Anderzijds; Ik vul nooit een geldig telefoonnummer in en soms is het wel leuk om toch de validatie voor de gek te houden :)
 
Ivo P

Ivo P

26/05/2021 19:18:41
Quote Anchor link
en spijker het ook niet te goed dicht:

Bepaalde begincijfers na 06- waren ooit niet mogelijk. (7/9 volgens mij) maar later zijn die toch in gebruik genomen.
En er kan zo maar een extra netnummer komen dat niet in je voorgedefinieerde lijstje staat.

Zelfde geldt voor emailadressen.
De eerste validators wilden 2 of 3 letters als TLD (.nl / .com) hebben en als je geluk had 4 (.info).
Sommigen timmerden ook nog dicht dat het een bekende land-extensie was.
Toen kwam .travel en .museum en tegenwoordig gaan al die validators nat met .amsterdam en .cocacola

en landen komen er ook nog af en toe bij....

Bottomline: vaak weet de gebruiker zelf zijn nummer het best.
En als je constateert dat het waarschijnlijk onjuist is, laat het dan in elk geval bij een waarschuwing.
Niets zo irritant als wanneer je je naam, emailadres of telefoonnummer niet in kunt voeren, omdat een slimme validator het niet met je eens was.

(kvk weigerde ooit emailadressen met een - erin. Helaas hadden al mijn domeinnamen dat toen)
 
Willem vp

Willem vp

26/05/2021 19:41:33
Quote Anchor link
En dan zijn er nog de 12-cijferige 06-nummers (06-097xxxxxxx), maar die worden in principe alleen gebruikt voor apparaten die niet bedoeld zijn voor communicatie tussen twee personen.
 
Michael -

Michael -

27/05/2021 18:29:08
Quote Anchor link
@Ivo: Precies wat ik ook bedoelde dus!
@Willem: Maar de tien cijferige 06 nummers zijn al een tijdje schaars, dus zou niet gek zijn dat we binnenkort wel deze nummers gaan gebruiken, of elf cijferig of iets totaal anders. Alles is mogelijk.

Het komt er allemaal gewoon op neer dat je validatie simpel moet hebben.

Nog zo'n voorbeeld: Onze nieuwbouwwijk staat nog steeds verkeerd in Google of andere API's die automatisch het adres invullen. Sommige zijn te eigenwijs dat je niet je eigen adres mag invullen/aanpassen. Dan missen ze dus gewoon weer wat klanten.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.