También sugeriría mirar la biblioteca de Google " libphonenumber ". Sé que no es una expresión regular, pero hace exactamente lo que quieres.
Por ejemplo, reconocerá que:
15555555555
es un número posible pero no es un número válido. También es compatible con países fuera de los EE. UU.
Aspectos destacados de la funcionalidad:
- Analizar / formatear / validar números de teléfono para todos los países / regiones del mundo.
getNumberType
- obtiene el tipo del número basado en el número mismo; capaz de distinguir números fijos, móviles, gratuitos, tarifas premium, costos compartidos, VoIP y personales (siempre que sea posible).
isNumberMatch
- obtiene un nivel de confianza sobre si dos números podrían ser iguales.
getExampleNumber
/ getExampleNumberByType
- proporciona números de ejemplo válidos para todos los países / regiones, con la opción de especificar qué tipo de número de teléfono de ejemplo se necesita.
isPossibleNumber
- adivinar rápidamente si un número es un número de teléfono posible utilizando solo la información de longitud, mucho más rápido que una validación completa.
isValidNumber
- validación completa de un número de teléfono para una región utilizando información de longitud y prefijo.
AsYouTypeFormatter
- Formatea números de teléfono sobre la marcha cuando los usuarios ingresan cada dígito.
findNumbers
- Encuentra números en la entrada de texto.
PhoneNumberOfflineGeocoder
- proporciona información geográfica relacionada con un número de teléfono.
Ejemplos
El mayor problema con la validación del número de teléfono es que depende mucho de la cultura.
- America
(408) 974–2042
es un número válido de EE. UU.
(999) 974–2042
no es un número válido de EE. UU.
- Australia
0404 999 999
es un número australiano válido
(02) 9999 9999
también es un número australiano válido
(09) 9999 9999
no es un número australiano válido
Una expresión regular está bien para verificar el formato de un número de teléfono, pero en realidad no va a poder verificar la validez de un número de teléfono.
Sugeriría omitir una expresión regular simple para probar su número de teléfono y usar una biblioteca como Google libphonenumber
(enlace al proyecto GitHub) .
¡Presentamos libphonenumber!
Usando uno de sus ejemplos más complejos, 1-234-567-8901 x1234
obtiene los siguientes datos libphonenumber
(enlace a la demostración en línea) :
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
Entonces, no solo aprende si el número de teléfono es válido (que es), sino que también obtiene un formato de número de teléfono consistente en su ubicación.
Como beneficio adicional, libphonenumber
tiene una serie de conjuntos de datos para verificar la validez de los números de teléfono, por lo que verificar un número como +61299999999
(la versión internacional de (02) 9999 9999
) devuelve como un número válido con formato:
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 también le brinda muchos beneficios adicionales, como obtener la ubicación en la que se detecta el número de teléfono y también obtener la información de zona horaria del número de teléfono:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Pero el número de teléfono australiano no válido ( (09) 9999 9999
) devuelve que no es un número de teléfono válido.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
La versión de Google tiene código para Java y Javascript, pero las personas también han implementado bibliotecas para otros idiomas que usan el conjunto de datos del número de teléfono Google i18n:
A menos que esté seguro de que siempre va a aceptar números de un lugar y que siempre estarán en un formato, sugeriría encarecidamente no escribir su propio código para esto y usar el número de teléfono para validar y mostrar números de teléfono.