Estoy buscando reformatear (reemplazar, no validar; hay muchas referencias para validar) un número de teléfono para mostrarlo en Javascript. A continuación, se muestra un ejemplo de algunos de los datos:
- 123 4567890
- (123) 456-7890
- (123)456-7890
- 123 456 7890
- 123.456.7890
- (en blanco / nulo)
- 1234567890
¿Existe una forma sencilla de utilizar una expresión regular para hacer esto? Estoy buscando la mejor manera de hacer esto. ¿Existe una forma mejor?
Quiero reformatear el número a lo siguiente: (123) 456-7890
javascript
regex
Matt K
fuente
fuente
Respuestas:
Suponiendo que desea el formato "
(123) 456-7890
":function formatPhoneNumber(phoneNumberString) { var cleaned = ('' + phoneNumberString).replace(/\D/g, '') var match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/) if (match) { return '(' + match[1] + ') ' + match[2] + '-' + match[3] } return null }
Aquí hay una versión que permite el
+1
código internacional opcional :function formatPhoneNumber(phoneNumberString) { var cleaned = ('' + phoneNumberString).replace(/\D/g, '') var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/) if (match) { var intlCode = (match[1] ? '+1 ' : '') return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('') } return null } formatPhoneNumber('+12345678900') // => "+1 (234) 567-8900" formatPhoneNumber('2345678900') // => "(234) 567-8900"
fuente
return (!m) ? null
areturn (!m) ? ""
después de agregar esta función.'' + phoneNumberString
es lo mismo quephoneNumberString
... Ya es una cadena.formatPhoneNumber(8001231234)
Solución posible:
function normalize(phone) { //normalize string and remove all unnecessary characters phone = phone.replace(/[^\d]/g, ""); //check if number length equals to 10 if (phone.length == 10) { //reformat and return phone number return phone.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3"); } return null; } var phone = '(123)4567890'; phone = normalize(phone); //(123) 456-7890
fuente
var x = '301.474.4062'; x = x.replace(/\D+/g, '') .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3'); alert(x);
fuente
x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');
que funcione para agregar '+1' delante del número de teléfono, por ejemploEsta respuesta toma prestada de la respuesta de maerics. Se diferencia principalmente en que acepta números de teléfono ingresados parcialmente y formatea las partes ingresadas.
phone = value.replace(/\D/g, ''); const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/); if (match) { phone = `${match[1]}${match[2] ? ' ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}`; } return phone
fuente
(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
newstring.length < oldstring.length
O para rastrear la posición del cursor y averiguar cuándo el usuario acaba de retroceder sobre esos delimitadores, por ejemploif (cursorPosition === 4 && numericString.length > 3)
Estoy usando esta función para formatear números de EE. UU.
function formatUsPhone(phone) { var phoneTest = new RegExp(/^((\+1)|1)? ?\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})( ?(ext\.? ?|x)(\d*))?$/); phone = phone.trim(); var results = phoneTest.exec(phone); if (results !== null && results.length > 8) { return "(" + results[3] + ") " + results[4] + "-" + results[5] + (typeof results[8] !== "undefined" ? " x" + results[8] : ""); } else { return phone; } }
Acepta casi todas las formas imaginables de escribir un número de teléfono de EE. UU. El resultado tiene el formato estándar de (987) 654-3210 x123
fuente
pensando al revés
Tome solo los últimos dígitos (hasta 10) ignorando el primer "1".
function formatUSNumber(entry = '') { const match = entry .replace(/\D+/g, '').replace(/^1/, '') .match(/([^\d]*\d[^\d]*){1,10}$/)[0] const part1 = match.length > 2 ? `(${match.substring(0,3)})` : match const part2 = match.length > 3 ? ` ${match.substring(3, 6)}` : '' const part3 = match.length > 6 ? `-${match.substring(6, 10)}` : '' return `${part1}${part2}${part3}` }
ejemplo de entrada / salida a medida que escribe
formatUSNumber('+1333') // (333) formatUSNumber('333') // (333) formatUSNumber('333444') // (333) 444 formatUSNumber('3334445555') // (333) 444-5555
fuente
var numbers = "(123) 456-7890".replace(/[^\d]/g, ""); //This strips all characters that aren't digits if (numbers.length != 10) //wrong format //handle error var phone = "(" + numbers.substr(0, 3) + ") " + numbers.substr(3, 3) + "-" + numbers.substr(6); //Create format with substrings
fuente
Casi todos estos tienen problemas cuando el usuario intenta retroceder sobre los delimitadores, particularmente desde la mitad de la cadena.
Aquí hay una solución de jquery que maneja eso y también se asegura de que el cursor permanezca en el lugar correcto mientras edita:
//format text input as phone number (nnn) nnn-nnnn $('.myPhoneField').on('input', function (e){ var $phoneField = e.target; var cursorPosition = $phoneField.selectionStart; var numericString = $phoneField.value.replace(/\D/g, '').substring(0, 10); // let user backspace over the '-' if (cursorPosition === 9 && numericString.length > 6) return; // let user backspace over the ') ' if (cursorPosition === 5 && numericString.length > 3) return; if (cursorPosition === 4 && numericString.length > 3) return; var match = numericString.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/); if (match) { var newVal = '(' + match[1]; newVal += match[2] ? ') ' + match[2] : ''; newVal += match[3] ? '-' + match[3] : ''; // to help us put the cursor back in the right place var delta = newVal.length - Math.min($phoneField.value.length, 14); $phoneField.value = newVal; $phoneField.selectionEnd = cursorPosition + delta; } else { $phoneField.value = ''; } })
fuente
Aquí hay uno que acepta tanto números de teléfono como números de teléfono con extensiones.
function phoneNumber(tel) { var toString = String(tel), phoneNumber = toString.replace(/[^0-9]/g, ""), countArrayStr = phoneNumber.split(""), numberVar = countArrayStr.length, closeStr = countArrayStr.join(""); if (numberVar == 10) { var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed. } else if (numberVar > 10) { var howMany = closeStr.length, subtract = (10 - howMany), phoneBeginning = closeStr.slice(0, subtract), phoneExtention = closeStr.slice(subtract), disX = "x", // Change the extension symbol here phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed. array = [phoneBeginningReplace, disX, phoneExtention], afterarray = array.splice(1, 0, " "), phone = array.join(""); } else { var phone = "invalid number US number"; } return phone; } phoneNumber("1234567891"); // Your phone number here
fuente
Puede usar estas funciones para verificar números de teléfono válidos y normalizarlos:
let formatPhone = (dirtyNumber) => { return dirtyNumber.replace(/\D+/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3'); } let isPhone = (phone) => { //normalize string and remove all unnecessary characters phone = phone.replace(/\D+/g, ''); return phone.length == 10? true : false; }
fuente
Hemos ampliado en la respuesta de David Baucum para incluir soporte para extensiones de hasta 4 dígitos de longitud. También incluye los paréntesis solicitados en la pregunta original. Este formato funcionará mientras escribe en el campo.
phone = phone.replace(/\D/g, ''); const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})(\d{0,4})$/); if (match) { phone = `(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}${match[4] ? ' x' : ''}${match[4]}`; } return phone;
fuente
Las soluciones anteriores son superiores, especialmente si utiliza Java y encuentra más números con más de 10 dígitos, como el prefijo del código internacional o números de extensión adicionales. Esta solución es básica (soy un principiante en el mundo de las expresiones regulares) y está diseñada teniendo en cuenta los números de teléfono de EE. UU. Y solo es útil para cadenas con solo 10 números con quizás algunos caracteres de formato, o tal vez sin caracteres de formato (solo 10 números ). Como tal, recomendaría esta solución solo para aplicaciones semiautomáticas. Personalmente, prefiero almacenar números como solo 10 números sin formatear caracteres, pero también quiero poder convertir o limpiar números de teléfono al formato estándar que la gente normal y las aplicaciones / teléfonos reconocerán instantáneamente a voluntad.
Encontré esta publicación buscando algo que pudiera usar con una aplicación de limpieza de texto que tenga capacidades PCRE Regex (pero no funciones de Java). Publicaré esto aquí para las personas que podrían usar una solución Regex pura simple que podría funcionar en una variedad de editores de texto, limpiadores, expansores o incluso algunos administradores de portapapeles. Yo personalmente uso Sublime y TextSoap. Esta solución se creó para Text Soap, ya que vive en la barra de menú y proporciona un menú desplegable donde puede activar acciones de manipulación de texto en lo que selecciona el cursor o en el portapapeles.
Mi enfoque es esencialmente dos sustituciones / buscar y reemplazar expresiones regulares. Cada búsqueda de sustitución y reemplazo implica dos expresiones regulares, una para buscar y otra para reemplazar.
Sustitución / Buscar y reemplazar # 1
Primera sustitución / búsqueda Regex:
\D
Primera sustitución / Reemplazo Regex: "" (nada, ni siquiera un espacio)
Sustitución / Buscar y reemplazar # 2
$1
, un grupo de captura para el segundo conjunto de tres números$2
, y el último grupo de captura para el último conjunto de cuatro números$3
. La expresión regular de la parte sustituta de la operación inserta el formato del número de teléfono de EE. UU. Entre el grupo de dígitos capturado.Segunda sustitución / búsqueda Regex:
(\d{3})(\d{3})(\d{4})
Segunda sustitución / Reemplazo de Regex:
\($1\) $2\-$3
La barra invertida
(<-whitespace), y
\
se escapa de los caracteres especiales(
,)
,-
ya que estamos insertándolos entre nuestros números capturados en grupos de captura$1
,$2
, y$3
para fines de formato el número de teléfono de Estados Unidos.En TextSoap creé un limpiador personalizado que incluye las dos acciones de operación de sustitución, por lo que en la práctica se siente idéntico a ejecutar un script. Estoy seguro de que esta solución podría mejorarse, pero espero que la complejidad aumente bastante. Una versión mejorada de esta solución es bienvenida como una experiencia de aprendizaje si alguien quiere agregar algo a esto.
fuente
Para números de teléfono de EE. UU.
/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/
Dividamos esta expresión regular en fragmentos más pequeños para que sea fácil de entender.
/^\(?
: Significa que el número de teléfono puede comenzar con un opcional(
.(\d{3})
: Después del opcional(
debe haber 3 dígitos numéricos. Si el número de teléfono no tiene un(
, debe comenzar con 3 dígitos. Por ejemplo,(308
o308
.\)?
: Significa que el número de teléfono puede tener un opcional)
después de los primeros 3 dígitos.[- ]?
: A continuación, el número de teléfono puede tener un guión (-
) opcional después)
si está presente o después de los primeros 3 dígitos.(\d{3})
: Entonces debe haber 3 dígitos numéricos más. Por ejemplo,(308)-135
o308-135
o308135
[- ]?
: Después del segundo conjunto de 3 dígitos, el número de teléfono puede tener otro guión opcional (-
). Por ejemplo,(308)-135-
o308-135-
o308135-
(\d{4})$/
: Finalmente, el número de teléfono debe terminar con cuatro dígitos. Por ejemplo,(308)-135-7895
o308-135-7895
o308135-7895
o3081357895
.Referencia:
http://www.zparacha.com/phone_number_regex/
fuente