validar telefono telefonico solo regulares regular para numeros numero letras expresión expresiones expresion espacios consecutivos celular regex validation phone-number

telefono - Un regex completo para la validación de números de teléfono



expresión regular para validar telefono (30)

¿Has RegExLib un vistazo a RegExLib ?

Ingresar el número de teléfono de los Estados Unidos trajo una lista de posibilidades.

Estoy tratando de armar una expresión regular para validar los números de teléfono. Lo ideal sería manejar formatos internacionales, pero debe manejar formatos de EE. UU., Incluidos los siguientes:

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

Responderé con mi intento actual, pero espero que alguien tenga algo mejor y / o más elegante.


Aquí está mi mejor intento hasta ahora. Maneja los formatos anteriores, pero estoy seguro de que me estoy perdiendo algunos otros formatos posibles.

^/d?(?:(?:[/+]?(?:[/d]{1,3}(?:[ ]+|[/-.])))?[(]?(?:[/d]{3})[/-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 /-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[/.]?)){1,2}(?:[/d]{1,5}))?$


Aquí hay un patrón maravilloso que se ajusta mejor a la validación que necesitaba lograr. No soy el autor original, pero creo que vale la pena compartirlo, ya que este problema me parece muy complejo y no tiene una respuesta concisa o útil.

La siguiente expresión regular detectará combinaciones de caracteres y números ampliamente utilizados en una variedad de formatos de números telefónicos globales:

/^/s*(?:/+?(/d{1,3}))?([-. (]*(/d{3})[-. )]*)?((/d{3})[-. ]*(/d{2,4})(?:[-.x ]*(/d+))?)/s*$/gm

Positivo:
+42 555.123.4567
+ 1- (800) -123-4567
+7 555 1234567
+7 (926) 1234567
(926) 1234567
+79261234567
926 1234567
9261234567
1234567
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 416 555 9292

Negativo:
926 3 4
8 800 600-APPLE

Fuente original: http://www.regexr.com/38pvb


Aunque la respuesta para eliminar todo el espacio en blanco es nítida, en realidad no resuelve el problema planteado, que es encontrar una expresión regular. Tome, por ejemplo, mi script de prueba que descarga una página web y extrae todos los números de teléfono usando la expresión regular. Ya que necesitaría una expresión regular de todos modos, también podría hacer que la expresión regular haga todo el trabajo. Se me ocurrió esto:

1?/W*([2-9][0-8][0-9])/W*([2-9][0-9]{2})/W*([0-9]{4})(/se?x?t?(/d*))?

Aquí hay un script de perl para probarlo. Cuando coincida, $ 1 contiene el código de área, $ 2 y $ 3 contienen el número de teléfono y $ 5 contiene la extensión. Mi script de prueba descarga un archivo de Internet e imprime todos los números de teléfono que contiene.

#!/usr/bin/perl my $us_phone_regex = ''1?/W*([2-9][0-8][0-9])/W*([2-9][0-9]{2})/W*([0-9]{4})(/se?x?t?(/d*))?''; my @tests = ( "1-234-567-8901", "1-234-567-8901 x1234", "1-234-567-8901 ext1234", "1 (234) 567-8901", "1.234.567.8901", "1/234/567/8901", "12345678901", "not a phone number" ); foreach my $num (@tests) { if( $num =~ m/$us_phone_regex/ ) { print "match [$1-$2-$3]/n" if not defined $4; print "match [$1-$2-$3 $5]/n" if defined $4; } else { print "no match [$num]/n"; } } # # Extract all phone numbers from an arbitrary file. # my $external_filename = ''http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt''; my @external_file = `curl $external_filename`; foreach my $line (@external_file) { if( $line =~ m/$us_phone_regex/ ) { print "match $1 $2 $3/n"; } }

Editar:

Puede cambiar / W * a / s * / W? / S * en la expresión regular para ajustarlo un poco. No estaba pensando en la expresión regular en términos de, por ejemplo, validar la entrada del usuario en un formulario cuando lo escribí, pero este cambio hace posible usar la expresión regular para ese propósito.

''1?/s*/W?/s*([2-9][0-8][0-9])/s*/W?/s*([2-9][0-9]{2})/s*/W?/s*([0-9]{4})(/se?x?t?(/d*))?'';


Creo que los módulos de Perl Number::Phone::US y Regexp::Common (especialmente la fuente de Regexp::Common::URI::RFC2806 ) podrían ayudar.

La pregunta probablemente debería especificarse con un poco más de detalle para explicar el propósito de validar los números. Por ejemplo, 911 es un número válido en los EE. UU., Pero 911x no es para ningún valor de x. Eso es para que la compañía telefónica pueda calcular cuando haya terminado de marcar. Hay varias variaciones sobre este tema. Pero su expresión regular no revisa la parte del código de área, por lo que no parece ser una preocupación.

Al igual que la validación de direcciones de correo electrónico, incluso si tiene un resultado válido, no puede saber si está asignado a alguien hasta que lo intente.

Si está tratando de validar la entrada del usuario, ¿por qué no normalizar el resultado y terminar con él? Si el usuario ingresa un número que no puede reconocer como un número válido, guárdelo como ingresado o elimine los caracteres no disponibles. El Number::Phone::Normalize Perl podría ser una fuente de inspiración.


Después de leer estas respuestas, parece que no hubo una expresión regular directa que pueda analizar un montón de texto y extraer números de teléfono en cualquier formato (incluso internacional con y sin el signo más).

Esto es lo que usé recientemente para un proyecto de un cliente, donde tuvimos que convertir todos los números de teléfono en cualquier formato para tel: links.

Hasta ahora, ha estado trabajando con todo lo que le han lanzado, pero si aparecen errores, actualizaré esta respuesta.

Regex:

/(/+*/d{1,})*([ |/(])*(/d{3})[^/d]*(/d{3})[^/d]*(/d{4})/

Función de PHP para reemplazar todos los números de teléfono con tel: links (en caso de que alguien sea curioso):

function phoneToTel($number) { $return = preg_replace(''/(/+*/d{1,})*([ |/(])*(/d{3})[^/d]*(/d{3})[^/d]*(/d{4})/'', ''<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>'', $number); // includes international return $return; }


Encontré que esto funciona bastante bien:

^/(*/+*[1-9]{0,3}/)*-*[1-9]{0,3}[-. /]*/(*[2-9]/d{2}/)*[-. /]*/d{3}[-. /]*/d{4} *e*x*t*/.* */d{0,4}$

Funciona para estos formatos de números:

1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 (234) 567-8901 1.234.567.8901 1/234/567/8901 12345678901 1-234-567-8901 ext. 1234 (+351) 282 433 5050

Asegúrese de usar banderas globales y multilínea para asegurarse.

Enlace: http://www.regexr.com/3bp4b


Escribí lo más simple (aunque no necesitaba un punto).

^([0-9/(/)///+ /-]*)$

Como se menciona a continuación, comprueba solo los caracteres, no su estructura / orden


Este es un patrón de expresión regular simple para números de teléfono móvil de Filipinas:

((/+[0-9]{2})|0)[./- ]?9[0-9]{2}[./- ]?[0-9]{3}[./- ]?[0-9]{4}

o

((/+63)|0)[./- ]?9[0-9]{2}[./- ]?[0-9]{3}[./- ]?[0-9]{4}

coincidirá con estos:

+63.917.123.4567 +63-917-123-4567 +63 917 123 4567 +639171234567 09171234567

El primero coincidirá con CUALQUIER código de país de dos dígitos, mientras que el segundo coincidirá exclusivamente con el código de país de Filipinas.

Pruébelo aquí: http://refiddle.com/1ox


Le resultará difícil lidiar con los números internacionales con una expresión regular simple / simple; consulte esta publicación sobre las dificultades de los números de teléfono internacionales (e incluso norteamericanos).

Querrá analizar los primeros dígitos para determinar cuál es el código de país y luego actuar de manera diferente según el país.

Más allá de eso, la lista que proporcionó no incluye otro formato común de EE. UU., Omitiendo el 1. inicial. La mayoría de los teléfonos celulares en los EE. UU. No lo requieren, y empezará a desconcertar a la generación más joven a menos que hayan marcado internacionalmente.

Has identificado correctamente que es un problema difícil ...

-Adán


Mejor opción ... simplemente elimine todos los caracteres que no sean dígitos en la entrada (excepto los signos ''x'' y ''+''), teniendo cuidado debido a la tendencia británica a escribir números en la forma no estándar +44 (0) ... cuando se le solicite usar el prefijo internacional (en ese caso específico, debe descartar el (0) completo).

Entonces, terminas con valores como:

12345678901 12345678901x1234 345678901x1234 12344678901 12345678901 12345678901 12345678901 +4112345678 +441234567890

Luego, cuando lo muestres, vuelve a formatear a tu gusto. p.ej

1 (234) 567-8901 1 (234) 567-8901 x1234


Mi intento de una expresión regular no restrictiva:

/^[+#*/(/)/[/]]*([0-9][ ext+-pw#*/(/)/[/]]*){6,45}$/

Acepta:

+(01) 123 (456) 789 ext555 123456 *44 123-456-789 [321] 123456 123456789012345678901234567890123456789012345 *****++[](][((( 123456tteexxttppww

Rechaza:

mob 07777 777777 1234 567 890 after 5pm john smith (empty) 1234567890123456789012345678901234567890123456 911

Depende de usted sanearlo para su visualización. Sin embargo, después de validarlo podría ser un número.


Mi intuición se ve reforzada por la cantidad de respuestas a este tema: que existe un número virtualmente infinito de soluciones a este problema, ninguna de las cuales será elegante.

Sinceramente, le recomendaría que no intente validar los números de teléfono. Incluso si pudieras escribir un validador grande y velludo que permitiera todos los diferentes formatos legítimos, terminaría permitiendo casi cualquier cosa que se parezca remotamente a un número de teléfono en primer lugar.

En mi opinión, la solución más elegante es validar una longitud mínima, nada más.


Respondí esta pregunta en otra pregunta SO antes de decidir incluir también mi respuesta como una respuesta en este hilo, porque nadie estaba tratando cómo requerir / no requerir elementos, solo entregar expresiones regulares: Regex funciona mal, combinando cosas inesperadas

Desde mi publicación en ese sitio, he creado una guía rápida para ayudar a cualquier persona a hacer su propia expresión regular para su propio formato de número de teléfono deseado, que advertiré (como hice en el otro sitio) que si usted es demasiado restrictivo, es posible que no obtenga los resultados deseados, y no existe una solución única para aceptar todos los números de teléfono posibles en el mundo, solo lo que decida aceptar como el formato de su elección. Úselo bajo su propio riesgo.

Hoja de trucos rápida

  • Comience la expresión: /^
  • Si desea requerir un espacio, use: [/s] o /s
  • Si desea requerir paréntesis, use: [(] y [)] . Usar /( y /) es feo y puede hacer que las cosas se confundan.
  • Si quieres que algo sea opcional, pon un ? después de
  • Si desea un guión, simplemente escriba - o [-] . Sin embargo, si no lo coloca primero o último en una serie de otros personajes, es posible que deba escapar de él: /-
  • Si desea aceptar diferentes opciones en una ranura, coloque corchetes alrededor de las opciones: [-./s] requerirá un guión, punto o espacio. Un signo de interrogación después del último corchete hará que todos esos sean opcionales para esa ranura.
  • /d{3} : Requiere un número de 3 dígitos: 000-999. Taquigrafía para [0-9][0-9][0-9] .
  • [2-9] : Requiere un dígito 2-9 para esa ranura.
  • (/+|1/s)? : Acepte un "más" o un 1 y un espacio (carácter de canalización, | , es "o"), y haga que sea opcional. El signo "más" debe ser escapado.
  • Si desea que los números específicos coincidan con una ranura, ingréselos: [246] requerirá un 2, 4 o 6. [77|78] requerirá 77 o 78.
  • $/ : Termina la expresión

Resulta que hay una especie de especificación para esto, al menos para América del Norte, llamada NANP .

Necesitas especificar exactamente lo que quieres. ¿Qué son los delimitadores legales? ¿Espacios, guiones y puntos? No se permite delimitador? ¿Se pueden mezclar delimitadores (por ejemplo, + 0.111-222.3333)? ¿Cómo se manejarán las extensiones (por ejemplo, 111-222-3333 x 44444)? ¿Qué pasa con los números especiales, como 911? ¿El código de área va a ser opcional o requerido?

Aquí hay una expresión regular para un número de 7 o 10 dígitos, con extensiones permitidas, los delimitadores son espacios, guiones o puntos:

^(?:(?:/+?1/s*(?:[.-]/s*)?)?(?:/(/s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])/s*/)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))/s*(?:[.-]/s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})/s*(?:[.-]/s*)?([0-9]{4})(?:/s*(?:#|x/.?|ext/.?|extension)/s*(/d+))?$


Si está hablando sobre la validación de formularios, la expresión regular para validar el significado correcto y los datos correctos será extremadamente compleja debido a las diferentes normas de los países y proveedores. También será difícil mantenerse al día.

Interpreto la pregunta como buscando un patrón ampliamente válido, que puede no ser coherente internamente; por ejemplo, tener un conjunto válido de números, pero sin validar que la línea troncal, el intercambio, etc. al patrón válido para el prefijo del código de país .

Norteamérica es sencillo, y para los internacionales, prefiero usar un patrón "idiomático" que cubra las formas en que las personas especifican y recuerdan sus números:

^((((/(/d{3}/))|(/d{3}-))/d{3}-/d{4})|(/+?/d{2}((-| )/d{1,8}){1,5}))(( x| ext)/d{1,5}){0,1}$

El patrón norteamericano asegura que si se incluye un paréntesis, ambos son. Las cuentas internacionales para un ''+'' inicial opcional y un código de país. Después de eso, estás en el idioma. Las coincidencias válidas serían:

  • (xxx)xxx-xxxx
  • (xxx)-xxx-xxxx
  • (xxx)xxx-xxxx x123
  • 12 1234 123 1 x1111
  • 12 12 12 12 12
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678

Esto puede estar sesgado ya que mi experiencia se limita a América del Norte, Europa y un poco de Asia.


Si solo quiere verificar que no tiene basura aleatoria en el campo (es decir, de los spammers de formularios), esta expresión regular debería funcionar bien:

^[0-9+/(/)#/./s//ext-]+$

Tenga en cuenta que no tiene reglas especiales sobre cuántos dígitos, o qué números son válidos en esos dígitos, solo verifica que solo los dígitos, paréntesis, guiones, más espacio, libra, asterisco, punto, coma o las letras e , x , t están presentes.

Debe ser compatible con números internacionales y formatos de localización. ¿Prevén alguna necesidad de permitir corchetes, rizos o en ángulo para algunas regiones? (Actualmente no están incluidos).

Si desea mantener las reglas por dígito (por ejemplo, en Códigos de área y prefijos de EE. UU. (Códigos de intercambio) debe estar dentro del rango de 200-999), buena suerte. Mantener un conjunto de reglas complejo que podría estar desactualizado en cualquier momento en el futuro por cualquier país del mundo no suena divertido.

Y mientras que eliminar todos / la mayoría de los caracteres no numéricos puede funcionar bien en el lado del servidor (especialmente si planea pasar estos valores a un marcador), es posible que no desee cambiar la entrada del usuario durante la validación, particularmente si desea que Hacer correcciones en otro campo.


También sugeriría mirar la libphonenumber Google " libphonenumber ". Sé que no es regex pero hace exactamente lo que quieres.

Por ejemplo, reconocerá que:

15555555555

es un número posible pero no un número válido. También apoya a países fuera de los Estados Unidos.

Aspectos destacados de la funcionalidad:

  • Análisis / formateo / validación de números telefónicos para todos los países / regiones del mundo.
  • getNumberType : obtiene el tipo del número basado en el número mismo; capaz de distinguir líneas fijas, móviles, sin costo, tarifas premium, costos compartidos, VoIP y números 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 : isPossibleNumber rápidamente si un número es un posible número de teléfono 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 con información de longitud y prefijo.
  • AsYouTypeFormatter : da formato a los números de teléfono sobre la marcha cuando los usuarios ingresan cada dígito.
  • findNumbers - encuentra números en el ingreso 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 es muy dependiente culturalmente.

  • America
    • (408) 974–2042 es un número válido de EE. UU.
    • (999) 974–2042 no es un número de EE. UU. Válido
  • 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 realmente no podrá verificar la validez de un número de teléfono.

Yo sugeriría saltarse una simple expresión regular para probar su número de teléfono y usar una biblioteca como el libphonenumber de libphonenumber de Google libphonenumber .

¡Introduciendo libphonenumber!

Usando uno de sus ejemplos más complejos, 1-234-567-8901 x1234 , obtiene los siguientes datos de 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

Así que no solo aprendes si el número de teléfono es válido (lo es), sino que también obtienes un formato de número de teléfono consistente en tu localidad.

Como libphonenumber adicional, libphonenumber tiene una serie de conjuntos de datos para verificar la validez de los números de teléfono, por lo que la verificación de 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 tomar la ubicación en la que se detecta el número de teléfono y también obtener la información de la 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 la gente también ha implementado bibliotecas para otros idiomas que usan el conjunto de datos de números de teléfono de Google i18n:

A menos que esté seguro de que siempre va a aceptar números de una localidad y que siempre van a estar en un formato, sugeriría no escribir su propio código para esto y usar libphonenumber para validar y mostrar números de teléfono.


Tenga en cuenta que los caracteres de separación () no funcionan para un estilo de escritura de números del Reino Unido que sea común: +44 (0) 1234 567890 que significa que debe marcar el número internacional:
+441234567890
o en el Reino Unido marque 01234567890


Trabajo para una empresa de investigación de mercado y tenemos que filtrar este tipo de información todo el tiempo. Lo estás complicando demasiado. Simplemente elimine los caracteres no alfanuméricos y vea si hay una extensión.

Para un análisis más detallado, puede suscribirse a uno de los muchos proveedores que le darán acceso a una base de datos de números válidos y le dirá si son teléfonos fijos o móviles, desconectados, etc. Cuesta dinero.


/^(?:(?:/(?(?:00|/+)([1-4]/d/d|[1-9]/d?)/)?)?[/-/./ ////]?)?((?:/(?/d{1,}/)?[/-/./ ////]?){0,})(?:[/-/./ ////]?(?:#|ext/.?|extension|x)[/-/./ ////]?(/d+))?$/i

Esto coincide:

- (+351) 282 43 50 50 - 90191919908 - 555-8909 - 001 6867684 - 001 6867684x1 - 1 (234) 567-8901 - 1-234-567-8901 x1234 - 1-234-567-8901 ext1234 - 1-234 567.89/01 ext.1234 - 1(234)5678901x1234 - (123)8575973 - (0055)(123)8575973

En $ n, guarda:

  1. Indicador de país
  2. Número de teléfono
  3. Extensión

Puede probarlo en https://www.regexpal.com/?fam=99127


Para cualquier persona interesada en hacer algo similar con los números de teléfono móvil irlandeses, aquí hay una manera directa de lograrlo:

http://ilovenicii.com/?p=87

PHP

<?php $pattern = "/^(083|086|085|086|087)/d{7}$/"; $phone = "087343266"; if (preg_match($pattern,$phone)) echo "Match"; else echo "Not match";

También hay una solución JQuery en ese enlace.

EDITAR:

solución jQuery:

$(function(){ //original field values var field_values = { //id : value ''url'' : ''url'', ''yourname'' : ''yourname'', ''email'' : ''email'', ''phone'' : ''phone'' }; var url =$("input#url").val(); var yourname =$("input#yourname").val(); var email =$("input#email").val(); var phone =$("input#phone").val(); //inputfocus $(''input#url'').inputfocus({ value: field_values[''url''] }); $(''input#yourname'').inputfocus({ value: field_values[''yourname''] }); $(''input#email'').inputfocus({ value: field_values[''email''] }); $(''input#phone'').inputfocus({ value: field_values[''phone''] }); //reset progress bar $(''#progress'').css(''width'',''0''); $(''#progress_text'').html(''0% Complete''); //first_step $(''form'').submit(function(){ return false; }); $(''#submit_first'').click(function(){ //remove classes $(''#first_step input'').removeClass(''error'').removeClass(''valid''); //ckeck if inputs aren''t empty var fields = $(''#first_step input[type=text]''); var error = 0; fields.each(function(){ var value = $(this).val(); if( value.length<12 || value==field_values[$(this).attr(''id'')] ) { $(this).addClass(''error''); $(this).effect("shake", { times:3 }, 50); error++; } else { $(this).addClass(''valid''); } }); if(!error) { if( $(''#password'').val() != $(''#cpassword'').val() ) { $(''#first_step input[type=password]'').each(function(){ $(this).removeClass(''valid'').addClass(''error''); $(this).effect("shake", { times:3 }, 50); }); return false; } else { //update progress bar $(''#progress_text'').html(''33% Complete''); $(''#progress'').css(''width'',''113px''); //slide steps $(''#first_step'').slideUp(); $(''#second_step'').slideDown(); } } else return false; }); //second section $(''#submit_second'').click(function(){ //remove classes $(''#second_step input'').removeClass(''error'').removeClass(''valid''); var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+/.[a-zA-Z]{2,4}$/; var fields = $(''#second_step input[type=text]''); var error = 0; fields.each(function(){ var value = $(this).val(); if( value.length<1 || value==field_values[$(this).attr(''id'')] || ( $(this).attr(''id'')==''email'' && !emailPattern.test(value) ) ) { $(this).addClass(''error''); $(this).effect("shake", { times:3 }, 50); error++; } else { $(this).addClass(''valid''); } function validatePhone(phone) { var a = document.getElementById(phone).value; var filter = /^[0-9-+]+$/; if (filter.test(a)) { return true; } else { return false; } } $(''#phone'').blur(function(e) { if (validatePhone(''txtPhone'')) { $(''#spnPhoneStatus'').html(''Valid''); $(''#spnPhoneStatus'').css(''color'', ''green''); } else { $(''#spnPhoneStatus'').html(''Invalid''); $(''#spnPhoneStatus'').css(''color'', ''red''); } }); }); if(!error) { //update progress bar $(''#progress_text'').html(''66% Complete''); $(''#progress'').css(''width'',''226px''); //slide steps $(''#second_step'').slideUp(); $(''#fourth_step'').slideDown(); } else return false; }); $(''#submit_second'').click(function(){ //update progress bar $(''#progress_text'').html(''100% Complete''); $(''#progress'').css(''width'',''339px''); //prepare the fourth step var fields = new Array( $(''#url'').val(), $(''#yourname'').val(), $(''#email'').val(), $(''#phone'').val() ); var tr = $(''#fourth_step tr''); tr.each(function(){ //alert( fields[$(this).index()] ) $(this).children(''td:nth-child(2)'').html(fields[$(this).index()]); }); //slide steps $(''#third_step'').slideUp(); $(''#fourth_step'').slideDown(); }); $(''#submit_fourth'').click(function(){ url =$("input#url").val(); yourname =$("input#yourname").val(); email =$("input#email").val(); phone =$("input#phone").val(); //send information to server var dataString = ''url=''+ url + ''&yourname='' + yourname + ''&email='' + email + ''&phone='' + phone; alert (dataString);//return false; $.ajax({ type: "POST", url: "http://clients.socialnetworkingsolutions.com/infobox/contact/", data: "url="+url+"&yourname="+yourname+"&email="+email+''&phone='' + phone, cache: false, success: function(data) { console.log("form submitted"); alert("success"); } }); return false; }); //back button $(''.back'').click(function(){ var container = $(this).parent(''div''), previous = container.prev(); switch(previous.attr(''id'')) { case ''first_step'' : $(''#progress_text'').html(''0% Complete''); $(''#progress'').css(''width'',''0px''); break; case ''second_step'': $(''#progress_text'').html(''33% Complete''); $(''#progress'').css(''width'',''113px''); break; case ''third_step'' : $(''#progress_text'').html(''66% Complete''); $(''#progress'').css(''width'',''226px''); break; default: break; } $(container).slideUp(); $(previous).slideDown(); }); });

Source


Aquí hay uno que funciona bien en JavaScript. Está en una cadena porque eso es lo que esperaba el widget Dojo.

Coincide con un número NANP de América del Norte de 10 dígitos con extensión opcional. Los espacios, guiones y puntos son delimitadores aceptados.

"^(//(?//d//d//d//)?)( |-|//.)?//d//d//d( |-|//.)?//d{4,4}(( |-|//.)?[ext//.]+ ?//d+)?$"


Encontré que esto es algo interesante. No lo he probado pero parece que funcionaría

<?php /* string validate_telephone_number (string $number, array $formats) */ function validate_telephone_number($number, $formats) { $format = trim(ereg_replace("[0-9]", "#", $number)); return (in_array($format, $formats)) ? true : false; } /* Usage Examples */ // List of possible formats: You can add new formats or modify the existing ones $formats = array(''###-###-####'', ''####-###-###'', ''(###) ###-###'', ''####-####-####'', ''##-###-####-####'', ''####-####'', ''###-###-###'', ''#####-###-###'', ''##########''); $number = ''08008-555-555''; if(validate_telephone_number($number, $formats)) { echo $number.'' is a valid phone number.''; } echo "<br />"; $number = ''123-555-555''; if(validate_telephone_number($number, $formats)) { echo $number.'' is a valid phone number.''; } echo "<br />"; $number = ''1800-1234-5678''; if(validate_telephone_number($number, $formats)) { echo $number.'' is a valid phone number.''; } echo "<br />"; $number = ''(800) 555-123''; if(validate_telephone_number($number, $formats)) { echo $number.'' is a valid phone number.''; } echo "<br />"; $number = ''1234567890''; if(validate_telephone_number($number, $formats)) { echo $number.'' is a valid phone number.''; } ?>


Estaba luchando con el mismo problema, tratando de hacer que mi solicitud fuera una prueba de futuro, pero estos muchachos me pusieron en la dirección correcta. En realidad no estoy revisando el número para ver si funciona o no, solo estoy tratando de asegurarme de que se ingresó una serie de números que pueden tener o no una extensión.

En el peor de los casos, si el usuario tuviera que extraer un número sin formatear del archivo XML, simplemente escribiría los números en el teclado numérico del teléfono 012345678x5, sin ninguna razón real para mantenerlo bonito. Ese tipo de RegEx saldría algo como esto para mí:

/d+ ?/w{0,9} ?/d+

  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

Haga un reemplazo en los caracteres de formato, luego verifique la validez del teléfono restante. En PHP,

$replace = array( '' '', ''-'', ''/'', ''('', '')'', '','', ''.'' ); //etc; as needed preg_match( ''/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i'', str_replace( $replace, '''', $phone_num );

Romper una expresión regular compleja como esta puede ser igual de eficaz, pero mucho más simple.


Mi inclinación es estar de acuerdo en que eliminar los no dígitos y simplemente aceptar lo que es mejor. Tal vez para asegurarse de que haya al menos un par de dígitos, aunque eso prohíbe algo como un número de teléfono alfabético "ASK-JAKE", por ejemplo.

Un par de expresiones perl simples podrían ser:

@f = /(/d+)/g; tr/0-9//dc;

Utilice el primero para mantener los grupos de dígitos juntos, lo que puede dar pistas de formato. Utilice el segundo para tirar trivialmente todos los no dígitos.

¿Es una preocupación que pueda haber una pausa y luego se ingresen más teclas? ¿O algo como 555-1212 (espere el pitido) 123?


Probablemente sería mejor usar una entrada enmascarada para esto. De esa manera, los usuarios SOLO pueden ingresar números y usted puede formatear como mejor le parezca. No estoy seguro de si esto es para una aplicación web, pero si lo es, hay un complemento jQuery que ofrece algunas opciones para hacer esto.

http://digitalbush.com/projects/masked-input-plugin/

Incluso repasan cómo enmascarar las entradas de números de teléfono en su tutorial.


pattern="^[/d|/+|/(]+[/)|/d|/s|-]*[/d]$" validateat="onsubmit"

Debe terminar con un dígito, puede comenzar con (o + o un dígito, y puede contener + - (o)


.*

Si el usuario quiere darle su número de teléfono, confíe en él para hacerlo bien. Si él no quiere dárselo, entonces obligarlo a ingresar un número válido lo enviará al sitio de un competidor o lo hará ingresar una cadena aleatoria que se ajuste a su expresión regular. Incluso podría tener la tentación de buscar el número de una línea de sexo con tarifa premium e ingresarla en su lugar.

También consideraría cualquiera de las siguientes entradas válidas en un sitio web:

"123 456 7890 until 6pm, then 098 765 4321" "123 456 7890 or try my mobile on 098 765 4321" "ex-directory - mind your own business"