¿Qué caracteres especiales se deben permitir para un número de teléfono?

20

Así que estoy diseñando una página web que se utilizará para usuarios globales, que incluye usuarios de Canadá, EE. UU., India, Reino Unido, etc. Necesito aplicar validaciones para este campo de número de teléfono, pero no estoy seguro de la mejor manera de hacerlo. .

Algunos de los formatos válidos que se me ocurren son:

  1. 1800123456 (India)
  2. uso de "-" en números de teléfono de EE. UU.

Estoy un poco confundido acerca de qué caracteres especiales debo permitir que un usuario ingrese (por ejemplo - / ()). ¿Cómo han resuelto esto otros en el pasado?

guardabosque
fuente
1
¿Qué pasa con los números de teléfono expresados ​​con letras, por ejemplo, 0800DIALTHIS?
Mouviciel
3
¿Qué estás tratando de prevenir? El usuario miente? ¿El usuario no quiere que sepas su número? ¿El usuario es demasiado vago para ingresar algo? El usuario haciendo un error tipográfico?
Benjol
@ mouviviel: sí, también tengo que pensar que estoy tomando un escenario de valuación a la vez, así que lo pensaré.
Guardabosques
@Benjol: Esta aplicación es comercial, por lo que no podemos arriesgarnos con nuestros clientes. Sé que un usuario ingresará un número correcto, pero ¿y si no lo hace? La valoración es bastante importante ya que guardan los errores tipográficos no solo de aplicación. No quiero que mi base de datos se llene de basura inútil.
Guardabosques
55
bueno, ¿qué estás haciendo para validar sus direcciones de correo electrónico? Observará que casi todos los sitios web realizan la validación de la "vida real" (es decir, que le envían un correo). Creo que si el número de teléfono es tan importante, deberías hacer algo equivalente.
Benjol

Respuestas:

21

El hecho de que pueda restringir algo (eso es lo que le pagan, como programador, para escribir código), eso no significa que realmente deba hacer esto.

¿Cuál es el punto de validar un número? ¿Por qué es útil? ¿Fallará si un usuario ingresa "0800DIALTHIS", o "私 は 電話 番号 を 持 っ て い な い", o "(499) 123-45-67 добавочный 4425"? Seguramente lo hará (usted dice "global". ¿No?), Mientras que los usuarios solo querían transmitirle una información importante sobre cómo contactarlos por teléfono.

Además, la forma en que se almacenan los datos debe regirse por la forma en que se usan. ¿Cómo usarás los números? ¿Se utilizarán para enviar automáticamente mensajes SMS no deseados o los gerentes los marcarán manualmente? Si es lo último, entonces está bien permitir caracteres adicionales, ya que el cerebro humano podrá analizarlos de la manera que considere más apropiada; y en este caso, realmente no necesita ninguna validación, lo que molestará a los usuarios humanos.

P Shved
fuente
77
+1 para "los usuarios solo querían transmitirle una información importante". Con demasiada frecuencia he visto validaciones innecesarias que simplemente molestan al usuario sin ningún requisito técnico (u organizativo) real.
perdian
66
+1: la validación del número de teléfono (especialmente definido de manera amplia) a menudo no tiene sentido, no está preparada para el futuro (KL5-6743 solía ser un número de teléfono válido, por ejemplo), y solo molesta a los usuarios que tienen casos especiales. Convierta sus números de teléfono en un campo de texto grande y deje que los marcadores automáticos (si hay alguno en este escenario) analicen lo que pueden. Las excepciones se pueden plantear a los humanos que pueden manejar la situación adecuadamente.
EZ Hart,
8
+1 y lo más importante solo porque un número de teléfono es válido, no significa que exista, e incluso si existe, no significa que pertenece a la persona en cuestión ...
Benjol
Ah, sí, averiguaré los países donde viven nuestros principales usuarios y luego escribiré un código de validación. Gracias a todos, les agradezco sus esfuerzos.
Guardabosques
44
@Ranger Eso es exactamente lo contrario de lo que estaba llegando la respuesta.
Sebastian Redl
7

Sería muy difícil saber si un número es válido o no, ya que diferentes países tienen diferentes formatos. En Francia, por ejemplo, 06 12 34 56 78 es un número de teléfono válido, mientras que 00 12 34 56 78 no lo es, ya que el número solo puede comenzar de 01 a 09, 06 y 07 en teléfonos móviles.

Además, los números de teléfono se pueden escribir en varios formatos, incluso en el mismo país. He visto:

  • 06 12 34 56 78
  • 0612345678
  • 06.12.34.56.78
  • 06-12-34-56-78
  • +33612345678
  • +33 (0) 6 12 34 56 78

Los dos últimos son la forma internacional.

En general:

  1. Permitir corchetes, +símbolo solo como personaje principal, guiones, puntos, comas y espacios.
  2. Si es posible, recuerde solo la forma normalizada (es decir, +33 (0) 612345678).
  3. Si esto no es posible, al menos elimine los caracteres separadores (como espacios).

No se recomienda profundizar demasiado en la validación por países. No solo hay una gran cantidad de reglas, sino que también cambian las reglas. Por ejemplo, en Francia, hace unos años no había números de teléfono a partir del 07 o 09. Con el creciente número de teléfonos móviles aparecieron 07. Con los servicios de VoIP aparecieron 09.

También puede tener en cuenta números especiales. Por ejemplo, 3635 es un número válido en Francia, incluso si contiene solo cuatro dígitos y comienza con un valor distinto de cero.

Arseni Mourzenko
fuente
1
Sería útil mostrar el uso de los corchetes en sus ejemplos. Los números internacionales a menudo los usan para encerrar el cero inicial del código de área para indicar que no lo marca cuando llama desde el extranjero. Por ejemplo, +31 (0)30 1234567donde 31 es Holanda, 030 es el código de área y 1234567 es el suscriptor.
Marjan Venema
2
No olvide un campo opcional para el código de extensión (que podría necesitar la tecla de la libra o el asterisco).
rwong
@MarjanVenema, no hago mucho marcado internacional, pero es estándar agregar el cero y agregar corchetes (0) para decirle que NO marque. ¿No sería más simple dejar de lado el 0?
CaffGeek
@ Chad: No. Le dice a los usuarios internacionales que deben dejarlo fuera y les dice a los usuarios nacionales que deben usarlo. No todos los países tienen códigos de área que comienzan con un cero. Hacerlo de esta manera asegura que cuando alguien vea el número sepa qué hacer cuando está dentro y fuera del país. No todos los que llaman a nivel nacional deben ser residentes después de todo ...
Marjan Venema
@MarjanVenema, oh, ya veo, no me di cuenta de que los usuarios nacionales lo necesitaban, aprendí algo nuevo hoy.
CaffGeek
3

NO restrinja los caracteres; toma todo lo que te da. Pero cuando lo marque, tome solo los dígitos. Incluso entonces podría funcionar mal. Estuve en Tailandia un año antes de saber que 123-4567-9 no significaba una extensión, sino un rango de números, 1234567 a 1234569. Cuando marqué "12345679" funcionó, porque la compañía telefónica ignoró el dígito extra. Tome cualquier cosa, marque solo dígitos.

Me encanta que mi nuevo teléfono permita espacios en el número de teléfono. Puedo ingresar "123 456 7890" así como así, no todos juntos.

Andy Canfield
fuente
2
+100. No hay nada peor que una computadora que dice "por favor elimine el - del número", como si la computadora no tuviera idea de cómo hacerlo por sí sola. Lo mismo para los números de tarjeta de crédito, FWIW.
Bryan Oakley
0

Soportes, tablero y espacio.

Una vez que el usuario ha ingresado el número de teléfono que contiene esos símbolos, puede validarlos de acuerdo con las reglas específicas del país (que deberá recopilar esas reglas para cada país), y luego los no dígitos pueden eliminarse cuando se procesa internamente en su software.

Esto se debe a que la IDD (marcación directa internacional) hace que sea imposible requerir que se utilicen realmente "caracteres especiales" para marcar un número, con la excepción de pausas al marcar los dígitos.

(No tengo conocimiento de esto en absoluto; corríjame si me equivoco).

rwong
fuente
3
Estás olvidando el signo \ + para acceso internacional
Marjan Venema
2
permita también la letra x: al menos en los EE. UU. es común prefijar una extensión con una x (por ejemplo: 555-1212 x123).
Bryan Oakley
0

Lo único que debe validarse es la cantidad de dígitos: ¿coincide con lo que necesitaría llamar?

Los códigos de acceso pueden / no deben ser permitidos por un usuario (es decir, +1 para los EE. UU.). Te diré por qué: si es un estadounidense que ingresa y no es tan inteligente, probablemente querrá ingresar 001 en lugar de 1. La razón es que 00 es cómo se accede a un número internacional desde los EE. UU. No saben cuál es la diferencia entre eso y solo +1. Si llama a líneas fijas entre códigos de área (y a veces en el mismo código de área), también ingresará un 1 antes de ese número. Justo como Japón.

Toma Japón Se accede a las líneas terrestres provinciales con un 0 en el frente de ellas. Pero si está marcando desde fuera de Japón, no necesita ese 0.

Los números de teléfono móvil en China son 10 dígitos y en Hong Kong son 8. Si su formulario captura el país, ni siquiera pida el código del país al comienzo del número, solo muéstrelo automáticamente en texto de solo lectura justo al lado de el número que necesitan ingresar

La lista continua.

Simplemente valide el número de dígitos (asegúrese de que no se acepten letras) y facilite que un usuario final ingrese el número correcto de dígitos. Es decir, no deberían tener que ingresar el código de país y si su formulario es súper inteligente, es posible que ni siquiera necesiten ingresar el código de área si es un número de teléfono fijo. O si comienzan a ingresar cosas como un código de acceso, como 0 delante de un número japonés, solo hágales saber que no es necesario.

Todos los demás personajes, además de los dígitos, deberían ser un punto discutible: no tienen la oportunidad de ingresarlos.

Todd Main
fuente
1
No estoy de acuerdo en asegurarme de que no se acepten cartas, continúe y acepte las, luego simplemente ignórelas. Las personas escriben naturalmente extensiones con una "x" inicial (por ejemplo: 555-1212 x123). ¿Por qué no permitir eso? Los humanos pueden analizarlo muy bien, y si la computadora necesita usarlo, puede quitar trivialmente los no dígitos.
Bryan Oakley
0

Google tiene lib para esto:

La biblioteca común de Java, C ++ y JavaScript de Google para analizar, formatear y validar números de teléfono internacionales.

https://github.com/googlei18n/libphonenumber

Hace el mejor esfuerzo, creo que debe haber casos que no se manejan, ya que de ninguna manera es una tarea fácil. Permita que los usuarios ingresen números y letras, luego elimine las letras con el código.

Christophe Roussy
fuente