[PHP] Regular Expressions Telefoonnummer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Ik probeer middels regex te controleren of het ingevoerde veld een juist telefoonnummer is. Ik heb daarvoor de volgende functie in elkaar gezet dat controleert of het ingevoerde veld bestaat uit cijfers, eventueel een punt, streepje of spatie. Helaas werkt dit niet.

Met de beschikbare handleidingen op het internet en zogenaamde cheat sheets kom ik er ook niet echt uit.

Ingevoerde telefoonnummers als deze moeten dus werken:
0201234567
020-1234567
020 1234567

Wie kan mij een beetje op weg helpen en vertellen waar ik nou precies de fout in ga?

PHP:
1
2
3
function checkNumeric($str) {
    return ( ! ereg("^[0-9\.\s-]+$", $str)) ? FALSE : TRUE;
}

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Werken geen van alle nummers? Want als ik je regEx test (zonder verder te kijken wat je doet) op http://www.spaweditor.com/scripts/regex/index.php, dan lijken ze allemaal geaccepteerd te worden.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Gebruik sowieso de preg_ functies ipv. ereg. functies, die ereg-functies gaan er uit in PHP6. Met als reden dat de preg_ functies een stuk beter zijn.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

En +31201234567? Of 0031(0)201234567?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
BtM909 schreef op dinsdag 19 mei 2009 @ 11:30:
Werken geen van alle nummers? Want als ik je regEx test (zonder verder te kijken wat je doet) op http://www.spaweditor.com/scripts/regex/index.php, dan lijken ze allemaal geaccepteerd te worden.
Ik had typefoutje in een andere foutafhandeling zitten waardoor de return steeds FALSE gaf. Die regex was inderdaad goed. Voortaan moet ik even verder kijken dus |:(

Bedankt trouwens voor die regex tool, wist niet dat zoiets bestond. Maakt alles een stuk gemakkelijker.

[ Voor 10% gewijzigd door DeepFreeze.NL op 19-05-2009 11:41 ]


Acties:
  • 0 Henk 'm!

  • Swaptor
  • Registratie: Mei 2003
  • Laatst online: 17-06 07:31

Swaptor

Java Apprentice

.oisyn's vraag blijft valide: hoe ga je om met de internationale notatie vane en Nederlands telefoonnummer?

Ontdek mij!
Proud NGS member
Stats-mod & forum-dude


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Cartman! schreef op dinsdag 19 mei 2009 @ 11:34:
Gebruik sowieso de preg_ functies ipv. ereg. functies, die ereg-functies gaan er uit in PHP6. Met als reden dat de preg_ functies een stuk beter zijn.
Bedankt voor je tip, ik ga het direct aanpassen!

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Swaptor schreef op dinsdag 19 mei 2009 @ 11:41:
.oisyn's vraag blijft valide: hoe ga je om met de internationale notatie vane en Nederlands telefoonnummer?
De website waar deze functie gebruikt voor gaat worden is voor de Nederlandse markt en voor mensen die woonachtig zijn in Nederland. Er is daarom dan ook geen controle van de internationale notatie noodzakelijk.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Er zijn zoveel manier om een telefoonnummer op te schrijven, dat ik eigenlijk maar één goede en werkende manier heb gevonden:

- flikker alles eruit wat geen cijfer is
- kijk of je minimaal 10 cijfers hebt

Zelfs dit is nog te streng, want als je ook buitenlandse telefoonnummers gaat accepteren moet die 10 omlaag naar 9. Voor m'n JavaScript validatie gebruik ik dan dit:

JavaScript:
1
2
if(! telefoonnummer.replace(/\D/g,"").match(/[0-9]{10}/))
  // telefoonnummer onjuist

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom niet eerst de spaties en - eruit halen met ereg_replace() oid en dan checken of je 10 cijfers overhoud?

edit: te laat ;)

[ Voor 10% gewijzigd door Verwijderd op 19-05-2009 11:46 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HuHu schreef op dinsdag 19 mei 2009 @ 11:44:
Er zijn zoveel manier om een telefoonnummer op te schrijven, dat ik eigenlijk maar één goede en werkende manier heb gevonden:

- flikker alles eruit wat geen cijfer is
- kijk of je minimaal 10 cijfers hebt

Zelfs dit is nog te streng, want als je ook buitenlandse telefoonnummers gaat accepteren moet die 10 omlaag naar 9. Voor m'n JavaScript validatie gebruik ik dan dit:

JavaScript:
1
2
if(! telefoonnummer.replace(/\D/g,"").match(/[0-9]{10}/))
  // telefoonnummer onjuist
En dan heb je 't nog niet over nummers waar bijv. het kengetal ontbreekt omdat 't een lokaal nummer is, of 0900 nummers etc. Nee, telefoonnummervalidatie is geen kattepis; trust me: ik ben er mee bezig geweest (onze business) maar heb uiteindelijk besloten dat de gebruiker maar zorgt dat 't "klopt". Het enige wat ik doe is zorgen dat er cijfers in zitten en geen letters. Basta :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op dinsdag 19 mei 2009 @ 11:45:
Waarom niet eerst de spaties en - eruit halen met ereg_replace() oid en dan checken of je 10 cijfers overhoud?

edit: te laat ;)
Alleen spaties en streepjes zijn niet genoeg. Op mijn site zie ik ook dingen voorbij komen als:

+31201234567
t: 020 123 456 7
(020) 1234567
020 1234567 / 06 12345678
vast: 020 1234567, mobiel: 06 12345678
020 1234567 of 030 7654321

En ook nog alle combinaties daarvan. Mensen vullen de meest gekke dingen in, dus je moet echt controleren op de meest basis dingen wil je alles kunnen afvangen: minimaal 10 cijfers, de rest boeit niet.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
RobIII schreef op dinsdag 19 mei 2009 @ 11:47:
[...]

En dan heb je 't nog niet over nummers waar bijv. het kengetal ontbreekt omdat 't een lokaal nummer is, of 0900 nummers etc. Nee, telefoonnummervalidatie is geen kattepis; trust me: ik ben er mee bezig geweest (onze business) maar heb uiteindelijk besloten dat de gebruiker maar zorgt dat 't "klopt". Het enige wat ik doe is zorgen dat er cijfers in zitten en geen letters. Basta :P
Ja, die validatie is voor een site waar producten worden verkocht. Dus 0900-nummers komen niet voor en lokale nummers ook niet (want internetbedrijf, dus men weet niet of het lokaal is of niet). Dus de eis van 10 cijfers vond ik wel acceptabel.

Totdat er mensen vanuit België gingen klagen dat ze bij hun ook 9 cijfers hebben :').

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

RobIII schreef op dinsdag 19 mei 2009 @ 11:47:
[...]

En dan heb je 't nog niet over nummers waar bijv. het kengetal ontbreekt omdat 't een lokaal nummer is, of 0900 nummers etc. Nee, telefoonnummervalidatie is geen kattepis; trust me: ik ben er mee bezig geweest (onze business) maar heb uiteindelijk besloten dat de gebruiker maar zorgt dat 't "klopt". Het enige wat ik doe is zorgen dat er cijfers in zitten en geen letters. Basta :P
Neem aan dat je + ook accepteert?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
BtM909 schreef op dinsdag 19 mei 2009 @ 11:52:
[...]

Neem aan dat je + ook accepteert?
Euh; uiteraard. Ik was misschien wat kort door de bocht maar inderdaad accepteer ik + ook, evenals - en haakjes (en misschien nog wel wat tekens, zou ik even moeten nakijken).

Wat wél nog kan helpen is 't opslaan in 2 velden. 1 zoals het ingevoerd is (met spaties, punten en hell, voor mijn part letters enz.) en 1 veld met wat er daadwerkelijk nodig is aan tekens om 't nummer nog te kunnen draaien. Daar hebben wij uiteindelijk dan ook voor gekozen.

Dan krijg je dus zoiets:

Displaynumber: +31 (123) 45 6 789 Of net welke 'notatie' de gebruiker prefereert
Number: +31123456789

[ Voor 18% gewijzigd door RobIII op 19-05-2009 11:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Maar daarmee vang je nog niet een invoer als "020 1234567 / 06 12345678" af :P.

Ow... en +31 (0)20 1234567 is ook altijd een leuke. Hoort die ene 0 er nu wel of niet bij als je het automatisch gaat valideren :D.

[ Voor 46% gewijzigd door HuHu op 19-05-2009 12:01 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HuHu schreef op dinsdag 19 mei 2009 @ 12:00:
Maar daarmee vang je nog niet een invoer als "020 1234567 / 06 12345678" af :P.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
(Rich Cook)
Het is sowieso nogal bepalend waar je de inhoud van dat veld voor gaat gebruiken. Is 't puur voor weergave op een uitdraai/scherm dan boeit 't niet en kun je jouw invoer prima toestaan. Ga je echter het systeem automatisch dat nummer laten bellen dan zal je validatie in elk geval wat strikter moeten zijn en goed om moeten kunnen gaan met nummers die dan (uiteindelijk) "niet thuis" geven.
HuHu schreef op dinsdag 19 mei 2009 @ 12:00:
Ow... en +31 (0)20 1234567 is ook altijd een leuke. Hoort die ene 0 er nu wel of niet bij als je het automatisch gaat valideren :D.
Dat is (ook nog eens) afhankelijk van 't land waarin je op dat moment zit of 't land waar je naar toe belt. Daarom laat je dat 't best over aan de gebruiker. Werkt 't niet dan past 'ie z'n invoer maar aan en moet 'ie (boehoe) eens een keer z'n grijze massa gebruiken. Sod it.

[ Voor 55% gewijzigd door RobIII op 19-05-2009 12:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • JJKiers
  • Registratie: April 2006
  • Laatst online: 09-12-2023
Een goed werkende check voor zowel nationale als internationale nummers is bijna niet te maken. Als je het helemaal volgens de specificaties van de ITU wilt doen (en in internationale notering), moet je bijna alle nummers accepteren, die beginnen met een bekende country code. De minimale lengte van een telefoonnummer is dan AFAIK 4 tekens, en de maximale lengte 15.

Totaal onwerkbaar dus voor de meeste gevallen. Zelf heb ik het opgelost door het wel op bovenstaande manier te doen, met een aparte uitzondering voor NL. Helaas hebben wij bijna geen mogelijkheden om de gebruiker (vooraf) op te hoogte te stellen van onjuiste telefoonnummers :| (verwerking in batches).

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
HuHu schreef op dinsdag 19 mei 2009 @ 11:44:
Er zijn zoveel manier om een telefoonnummer op te schrijven, dat ik eigenlijk maar één goede en werkende manier heb gevonden:

- flikker alles eruit wat geen cijfer is
- kijk of je minimaal 10 cijfers hebt

Zelfs dit is nog te streng, want als je ook buitenlandse telefoonnummers gaat accepteren moet die 10 omlaag naar 9. Voor m'n JavaScript validatie gebruik ik dan dit:

JavaScript:
1
2
if(! telefoonnummer.replace(/\D/g,"").match(/[0-9]{10}/))
  // telefoonnummer onjuist
Dit lijkt mij nu inderdaad ook de beste manier. Ik heb het nu als volgt gedaan:
PHP:
1
2
3
4
function checkTelefoonnummer($str) {
    $nummer = preg_replace("/[^0-9]/i", "", $str);
    if (strlen($nummer) != 10) { return FALSE; } else { return TRUE; }
}

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Is het niet makkelijker om eerst te controleren wat de input is en daarop te valideren?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function CheckInput($str)
{
       /*
             The 0031599121212 format
       */
       if(preg_match("/[0-9]{13}/", $str)) {
               return true;
       } else {
            /*
                 Other formats
            */
       }
}


Hierboven staat maar een klein voorbeeldje, regex nog niet getest maar het moet werken, zo kan je het volgens mij op alles wel bekijken.

[ Voor 2% gewijzigd door Manuel op 19-05-2009 15:20 . Reden: Ty Khainer om me fout aan te tonen! ]


Acties:
  • 0 Henk 'm!

Verwijderd

Manueltje22 schreef op dinsdag 19 mei 2009 @ 15:14:
Is het niet makkelijker om eerst te controleren wat de input is en daarop te valideren?

...

Hierboven staat maar een klein voorbeeldje, regex nog niet getest maar het moet werken, zo kan je het volgens mij op alles wel bekijken.
Vrij dubbel op he, in je regexp controleer je al of het 13 nummers zijn, dus waarom eerst de string controleren?

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Verwijderd schreef op dinsdag 19 mei 2009 @ 15:18:
[...]


Vrij dubbel op he, in je regexp controleer je al of het 13 nummers zijn, dus waarom eerst de string controleren?
Nuja inderdaad, ik zie het nu ook pas!
Domme fout van me :X
Pagina: 1