Vorrei anche suggerire di guardare la libreria di Google " libphonenumber ". So che non è regex ma fa esattamente quello che vuoi.
Ad esempio, riconoscerà che:
15555555555
è un numero possibile ma non un numero valido. Supporta anche paesi al di fuori degli Stati Uniti.
Punti salienti della funzionalità:
- Analisi / formattazione / convalida dei numeri di telefono per tutti i paesi / regioni del mondo.
getNumberType
- ottiene il tipo di numero in base al numero stesso; in grado di distinguere numeri fissi, mobili, numeri verdi, tariffe premium, costi condivisi, VoIP e numeri personali (ove possibile).
isNumberMatch
- ottiene un livello di confidenza se due numeri potrebbero essere uguali.
getExampleNumber
/ getExampleNumberByType
- fornisce numeri di esempio validi per tutti i paesi / regioni, con la possibilità di specificare quale tipo di numero di telefono di esempio è necessario.
isPossibleNumber
- indovinare rapidamente se un numero è un numero di telefono possibile utilizzando solo le informazioni sulla lunghezza, molto più velocemente di una convalida completa.
isValidNumber
- convalida completa di un numero di telefono per una regione utilizzando informazioni su lunghezza e prefisso.
AsYouTypeFormatter
- formatta i numeri di telefono al volo quando gli utenti inseriscono ciascuna cifra.
findNumbers
- trova numeri nell'inserimento di testo.
PhoneNumberOfflineGeocoder
- fornisce informazioni geografiche relative a un numero di telefono.
Esempi
Il problema più grande con la convalida del numero di telefono è che dipende molto dalla cultura.
- America
(408) 974–2042
è un numero USA valido
(999) 974–2042
non è un numero USA valido
- Australia
0404 999 999
è un numero australiano valido
(02) 9999 9999
è anche un numero australiano valido
(09) 9999 9999
non è un numero australiano valido
Un'espressione regolare va bene per controllare il formato di un numero di telefono, ma in realtà non sarà in grado di verificare la validità di un numero di telefono.
Suggerirei di saltare una semplice espressione regolare per testare il tuo numero di telefono e di utilizzare una libreria come quella di Google libphonenumber
(link al progetto GitHub) .
Presentazione di libphonenumber!
Utilizzando uno dei tuoi esempi più complessi, 1-234-567-8901 x1234
ottieni i seguenti dati da libphonenumber
(link alla demo online) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Quindi non solo impari se il numero di telefono è valido (quale è), ma ottieni anche una formattazione coerente del numero di telefono nella tua lingua.
Come bonus, libphonenumber
ha un numero di set di dati per verificare la validità dei numeri di telefono, quindi controllando un numero come +61299999999
(la versione internazionale di (02) 9999 9999
) si restituisce un numero valido con formattazione:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
libphonenumber ti offre anche molti altri vantaggi, come la presa della posizione in cui viene rilevato il numero di telefono e anche ottenere le informazioni sul fuso orario dal numero di telefono:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Ma il numero di telefono australiano non valido ( (09) 9999 9999
) restituisce che non è un numero di telefono valido.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
La versione di Google ha codice per Java e Javascript, ma le persone hanno anche implementato librerie per altre lingue che utilizzano il set di dati del numero di telefono di Google i18n:
A meno che non si sia certi di accettare sempre numeri da una locale e che siano sempre in un formato, suggerirei vivamente di non scrivere il proprio codice per questo e di utilizzare libphonenumber per convalidare e visualizzare i numeri di telefono.