Pregunta

Estoy tratando de armar un completo expresión regular para validar números de teléfono.Lo ideal sería manejar formatos internacionales, pero se debe manejar NOSOTROS formatos, 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

Voy a responder con mi actual intento, pero espero que alguien tiene algo mejor y/o más elegante.

¿Fue útil?

Solución

Mejor opción...simplemente tira de todos los no-dígito de caracteres en la entrada (a excepción de 'x' y líder de '+' signos), teniendo cuidado debido a los Británicos tendencia a escribir los números en el formulario no estándar +44 (0) ... cuando se le preguntó a usar el prefijo internacional (en ese caso específico, se debe descartar la (0) completamente).

A continuación, terminar con valores como:

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

Luego, cuando la pantalla, vuelva a formatear a su contenido de los corazones.por ejemplo,

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

Otros consejos

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

Debe especificar exactamente lo que usted desea.¿Son legales los delimitadores?Espacios, guiones y puntos?No delimitador permite?Se puede mezclar delimitadores (por ejemplo, +0.111-222.3333)?Cómo son las extensiones (por ejemplo, 111-222-3333 x 44444) va a ser manejado?¿Qué acerca de los números especiales, como el 911?Es el código de área que va a ser opcional u obligatorio?

He aquí una expresión regular que un 7 o un número de 10 dígitos, con extensiones permitidas, los delimitadores de 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 el usuario quiere darte su número de teléfono, y luego confiar en él para hacer lo correcto.Si él no quiere darle a usted, a continuación, lo que le obligó a introducir un número válido enviará él a sitio de un competidor o le hacen entrar en una cadena aleatoria que se adapte a su regex.Yo incluso podría estar tentado a buscar el número de una tarifa de la prima de sexo en línea y entrar en ese lugar.

También me gustaría considerar cualquiera de los siguientes como 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"

También me gustaría sugerir que mira "libphonenumber"Biblioteca De Google.Sé que no es regex, pero hace exactamente lo que usted desea.

Por ejemplo, se reconoce que:

15555555555

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

Aspectos más destacados de la funcionalidad:

  • Análisis/formato/validación de los números de teléfono de todos los países/regiones del mundo.
  • getNumberType - obtiene el tipo de la serie basada en el mismo número;capaz de distinguir la línea Fija, Móvil, Toll-free, Premium Tasa de Costo Compartido, VoIP y Números Personales (cuando sea factible).
  • isNumberMatch - consigue un nivel de confianza en si dos números podrían ser la misma.
  • getExampleNumber/getExampleNumberByType - proporciona válido números de ejemplo para todos los países/regiones, con la opción de especificar que el tipo de número de teléfono de ejemplo que se necesita.
  • isPossibleNumber - rápidamente adivinar si un número es un posible número de teléfono utilizando sólo 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 mediante la longitud y la información de prefijo.
  • AsYouTypeFormatter - formatos de números de teléfono sobre la marcha cuando los usuarios entran cada dígito.
  • findNumbers - encuentra los números en el texto de entrada.
  • PhoneNumberOfflineGeocoder - proporciona información geográfica relacionada con un número de teléfono.

Ejemplos

El mayor problema con la validación de número de teléfono es que es muy culturalmente dependientes.

  • América
    • (408) 974–2042 es un válido El número de la US
    • (999) 974–2042 es no válido El número de la US
  • Australia
    • 0404 999 999 es un válido Número australiano
    • (02) 9999 9999 es también un válido Número australiano
    • (09) 9999 9999 es no válido Número australiano

Una expresión regular es bueno para comprobar el formato de un número de teléfono, pero en realidad no va a ser capaz de comprobar el validez de un número de teléfono.

Yo sugeriría a saltar una simple expresión regular para probar su número de teléfono en contra, y el uso de una biblioteca como el de Google libphonenumber (enlace a GitHub del proyecto).

La introducción de libphonenumber!

Utilizando uno de sus ejemplos más complejos, 1-234-567-8901 x1234, usted obtener los siguientes datos de libphonenumber (enlace a la 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

Así que no sólo se aprende si el número de teléfono válido (que lo es), pero usted también consigue constante el número de teléfono de formato en la configuración regional.

Como un bono, libphonenumber tiene un número de conjuntos de datos para comprobar la validez de los números de teléfono, así que la comprobación de un número como por ejemplo +61299999999 (la versión internacional de (02) 9999 9999) se devuelve como un número válido con el 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 te da muchos beneficios adicionales, tales como el acaparamiento de la ubicación en la que el número de teléfono es detectado como ser, 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 no válida Australiano número de teléfono ((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

Google tiene una versión de código para Java y Javascript, pero la gente también se han implementado las bibliotecas para otros idiomas que usan el Google i18n número de teléfono del conjunto de datos:

A menos que esté seguro de que siempre va a ser la aceptación de los números a partir de una configuración regional, y siempre van a estar en un formato, me gustaría fuertemente sugieren no escribir su propio código para esto, y el uso de libphonenumber para la validación y visualización de números de teléfono.

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

Esto coincide con:

 - (+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, se salva:

  1. País indicador
  2. Número de teléfono
  3. La extensión de

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

Aunque la respuesta a la franja de todos los espacios en blanco es limpio, que realmente no se soluciona el problema que se plantea, que es la de encontrar una expresión regular.Tomemos, por ejemplo, mi script de prueba que descarga una página web y extrae todos los números de teléfono con la expresión regular.Desde que había necesidad de una expresión regular de todos modos, puedes tener la regex hacer 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*))?

He aquí un script en perl para probarlo.Cuando coinciden, $1 contiene el código de área, $2 y $3 contiene el número de teléfono, y $5 contiene la extensión.Mi script de prueba de descarga un archivo de internet y se imprime todos los números de teléfono en ella.

#!/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:

Usted puede cambiar \W* a \s*\W?\s* en el regex para apretar un poco.Yo no estaba pensando en el regex en términos de, por ejemplo, validar la entrada del usuario en un formulario cuando lo escribí, pero este cambio hace posible el uso de 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*))?';

He contestado a esta pregunta en otro, ASÍ que pregunta antes de decidir incluir también mi respuesta como una respuesta en este hilo, porque no se abordan cómo solicitar/no se requieren elementos, sólo se entrega a cabo regexs:Regex trabajando mal, la coincidencia de cosas inesperadas

A partir de mi post en este sitio, he creado una guía rápida para ayudar a cualquier persona con la fabricación de su propia expresión regular su propio número de teléfono deseado formato, la que será de advertencia (como yo hice en el otro sitio) que si son demasiado restrictivas, puede no obtener los resultados deseados, y que no hay "una talla para todos" la solución a la aceptación de todos los posibles números de teléfono en el mundo - sólo lo que usted decide aceptar como su formato de elección.Utilice a su propio riesgo.

Rápido de la hoja de trucos

  • Inicio de la expresión: /^
  • Si desea solicitar un espacio, utilice: [\s] o \s
  • Si desea solicitar paréntesis, utilice: [(] y [)] .El uso de \( y \) es feo y puede hacer las cosas más confusas.
  • Si quieres algo para ser opcional, poner un ? después de que se
  • Si quieres un guión, sólo tienes que escribir - o [-] .Si usted no es el primero o el último en una serie de otros personajes, sin embargo, usted puede necesitar para escapar de él: \-
  • Si desea aceptar las diferentes opciones en una ranura, poner entre corchetes las opciones: [-.\s] requerirá de un guión, período, o en el espacio.Un signo de interrogación después de la última soporte hará que todos los facultativos para que la ranura.
  • \d{3} :Se requiere un número de 3 dígitos:000-999.De taquigrafía para [0-9][0-9][0-9].
  • [2-9] :Requiere un dígito del 2 al 9 para que la ranura.
  • (\+|1\s)? :Aceptar un "plus" o un 1 y un espacio (carácter de canalización, |, es "o"), y es facultativo.El "plus" signo debe ser escapado.
  • Si desea que los números específicos para que coincida con una ranura, entre ellos: [246] se requieren 2, 4, o 6. [77|78] se requieren 77 o 78.
  • $/ :Final de la expresión

Escribí simplicidad (aunque yo no tenía necesidad de un punto en ella).

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

Como se menciona a continuación, comprueba sólo para los personajes, no su estructura/orden

Tenga en cuenta que pelar () los personajes no funciona para un estilo de escritura reino unido números que es común: +44 (0) 1234 567890 lo que significa que marcar el número internacional:
+441234567890
o en el reino unido de línea 01234567890

Si usted sólo quiere comprobar de que usted no tiene aleatorio de basura en el campo (es decir, de forma que los spammers) esta expresión debe hacer muy bien:

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

Tenga en cuenta que no tiene ningún tipo de reglas especiales para cuántos dígitos, o qué son los números válidos en esos dígitos, sólo verifica que sólo dígitos, paréntesis, guiones, además, el espacio, la libra esterlina, el asterisco, punto, coma, o las letras e, x, t están presentes.

Debe ser compatible con los números internacionales y la localización de los formatos.¿Prevén la necesidad de permitir la plaza, rizado, o el ángulo de los soportes para algunas regiones?(actualmente no están incluidos).

Si desea mantener por dígito reglas (como en NOSOTROS los Códigos de Área o Prefijos (intercambio de códigos) debe caer en el rango de 200-999) bueno, buena suerte para usted.El mantenimiento de un complejo conjunto de reglas que pueden ser actualizados en cualquier momento en el futuro por cualquier país en el mundo no suena divertido.

Y mientras pelar todos/la mayoría de los caracteres no numéricos pueden funcionar bien en el lado del servidor (especialmente si usted está planeando sobre el paso de estos valores para un marcador), puede que no desee thrash de la entrada del usuario durante la validación, especialmente si usted los quiere para hacer correcciones en otro campo.

Ha tenido usted un vistazo por encima a RegExLib?

Introducir número de teléfono de US trajo una gran lista de posibilidades.

Mi intento en un irrestricta regex:

/^[+#*\(\)\[\]]*([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

Es hasta usted para desinfectarlo para mostrar.Después de validarlo podría ser un número, aunque.

He encontrado este que 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úmero:

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 utilizar mundial Y de varias líneas de banderas para asegurarse.

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

Si usted está hablando acerca de la validación de formularios, la expresión regular para validar el significado correcto así como corregir los datos que van a ser extremadamente complejo, debido a diferentes país y proveedor de los estándares.También será difícil mantener hasta la fecha.

Yo interpreto la pregunta como buscando una amplia válido patrón, que puede no ser consistente internamente - por ejemplo, tener un conjunto válido de los números, pero no de la validación de que el tronco de la línea, exchange, etc.para la válida patrón para el código de país prefijo.

América del norte es sencillo, y para la internacional prefiero usar un 'idiomáticas' patrón que cubre las formas en que las personas especificar y recordar 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 uno de los paréntesis se incluye ambos son.Las cuentas internacionales por un facultativo inicial de '+' y el código de país.Después de eso, estás en la jerga.Válido partidos sería:

  • (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 ser sesgada como mi experiencia se limita a América del Norte, Europa y un poco de Asia.

Mi sensación es reforzado por la cantidad de respuestas a este tema - que no es un número virtualmente infinito de soluciones a este problema, ninguno de los cuales van a ser elegante.

Honestamente, yo recomendaría que usted no trate de validar números de teléfono.Incluso si usted podría escribir un grande, peludo validador que permitiera a todas las legítimo diferente formatos, acabaría permitiendo bastante mucho nada ni remotamente parecido a un número de teléfono en primer lugar.

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

Este es un simple patrón de Expresión Regular para Filipinas Números de Teléfono Móvil:

((\+[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}

coinciden estos:

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

En el primer partido de CUALQUIERA de los dos dígitos de código de país, mientras que el segundo va a coincidir con la de Filipinas código de país exclusivamente.

Prueba aquí: http://refiddle.com/1ox

Usted tendrá un tiempo difícil tratar con números internacionales con un simple/simple regex, ver este post sobre las dificultades de la internacional (e incluso de américa del norte) números de teléfono.

Usted querrá analizar el primer par de dígitos para determinar cuál es el código de país, luego actuar de manera diferente según el país.

Más allá de que - la lista que dio no incluye otro común NOS formato - dejando fuera de la inicial 1.La mayoría de los teléfonos celulares en los estados unidos no lo requieren, y se va a empezar a desconcertar a la generación más joven, a menos que haya marcado a nivel internacional.

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

-Adam

He aquí un maravilloso patrón que más se asemejaba a la de validación que necesitaba para lograr.Yo no soy el autor original, pero creo que bien vale la pena compartir como me encontré con que este problema es muy complejo y sin una concisa o muy útil la respuesta.

La siguiente expresión regular se captura ampliamente utilizado número y combinaciones de caracteres en una variedad de número de teléfono global formatos:

/^\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

Aquí está mi lo mejor es probar hasta ahora.Se encarga de los formatos anteriores, pero estoy seguro que me faltan 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}))?$

Después de leer a través de estas respuestas, parece que no fue una simple expresión regular que se puede analizar a través de un montón de texto y sacar números de teléfono en cualquier formato (incluyendo los internacionales, con y sin el signo más).

Aquí es lo que he usado para un proyecto de un cliente recientemente, donde tuvimos que convertir todos los números de teléfono en cualquier formato a tel:los enlaces.

Hasta ahora, ha estado trabajando con todo lo que he tirado, pero si los errores de llegar, voy a actualizar esta respuesta.

Regex:

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

Función PHP para reemplazar todos los números de teléfono con tel.:los enlaces (en caso de que alguien tiene curiosidad):

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;
}

Yo creo que el Número::Teléfono: NOSOTROS y Regexp::Común (en particular, la fuente de Regexp::Común::URI::RFC2806) Módulos de Perl que podría ayudar.

La pregunta debería de ser especificado en un poco más de detalle a explicar el propósito de la validación de los números.Por ejemplo, el 911 es un número válido en los estados unidos, pero 911x no es para cualquier valor de x.Que con el fin de que la compañía de teléfonos puede calcular cuando haya terminado de marcar.Hay varias variaciones sobre este tema.Pero su expresión no comprueba el código de área de la porción, por lo que no parece ser una preocupación.

Como validar direcciones de correo electrónico, incluso si usted tiene un resultado válido no se puede saber si es asignado a alguien hasta que lo pruebes.

Si usted está tratando de validar la entrada del usuario, ¿por qué no normalizar el resultado y hacer con ella?Si el usuario pone en un número que no puede reconocer como un número válido, guardarlo como ingresado o tiras de undailable caracteres.El Número::Teléfono: Normalizar Módulo de Perl, podría ser una fuente de inspiración.

Yo trabajo para una empresa de investigación de mercado y tenemos que filtrar estos tipos de entrada alllll el tiempo.Estás complicando demasiado.Simplemente tira de la no-alfanuméricos caracteres, y ver si hay una extensión.

Para más análisis, usted puede suscribirse a uno de los muchos proveedores que le dará acceso a una base de datos de números válidos así como dirá si son fijos o móviles, desconectado, etc.Cuesta dinero.

Reemplaza en el formato de caracteres, a continuación, compruebe el resto de teléfono de validez.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 );

La ruptura de un complejo regexp como este puede ser igual de eficaz, pero mucho más simple.

He encontrado esto para ser algo interesante.No lo he probado pero se ve como si fuera a trabajar

<?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.';
}
?>

Probablemente sería mejor usar una máscara de Entrada para este.De esa manera los usuarios pueden ingresar SOLO números y puede formatear sin embargo le parezca.No estoy seguro de si se trata de una aplicación web, pero si es que existe un clic plugin de jQuery que ofrece algunas de las opciones para hacer esto.

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

Incluso van más de cómo la máscara de teléfono número de entradas en su tutorial.

Aquí está uno que funciona bien en JavaScript.Es en una cadena porque eso es lo que el Dojo widget estaba esperando.

Coincide con una de 10 dígitos de América del Norte NANP número de extensión opcional.Espacios, guiones y los períodos son aceptadas delimitadores.

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

Yo estaba luchando con el mismo problema, tratando de hacer que mi aplicación a prueba de futuro, pero estos chicos se me va en la dirección correcta.Yo no soy la comprobación de que el número en sí mismo para ver si funciona o no, sólo estoy tratando de asegurarse de que una serie de números fue introducido que puede o no puede tener una extensión.

Peor de los casos si el usuario tenía que tirar de un sin número del archivo XML, que sólo escriba los números en el teléfono numberpad 012345678x5, no hay ninguna razón real para mantenerlo bonito.Que tipo de RegEx saldría algo como esto para mí:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

Mi inclinación es estar de acuerdo en que stripping no-dígitos y la aceptación de lo que hay es lo mejor.Tal vez para asegurar al menos un par de dígitos, a pesar de que no prohibir algo así como un alfabeto número de teléfono "ASK-JAKE", por ejemplo.

Un par simple perl expresiones pueden ser:

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

Utilice la primera de ellas para mantener a los grupos de dígitos juntos, lo que puede dar formato de pistas.El uso de la segunda para trivialmente mezcle todos los no-dígitos.

Es una preocupación que puede ser necesario una pausa y, a continuación, más claves introducidas?O algo como 555-1212 (espere el bip) 123?

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

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

Para cualquier persona interesada en hacer algo similar con el Irlandés números de teléfono móvil, aquí tienes una forma sencilla de conseguirlo:

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 un JQuery solución en ese enlace.

EDITAR:

jQuery solución:

    $(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();
});


});

Fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top