Regulärer Ausdruck zum Neuformatieren einer US-Telefonnummer in Javascript

92

Ich möchte eine Telefonnummer für die Anzeige in Javascript neu formatieren (ersetzen, nicht validieren - es gibt viele Referenzen zum Validieren). Hier ist ein Beispiel für einige Daten:

  • 123 4567890
  • (123) 456-7890
  • (123) 456-7890
  • 123 456 7890
  • 123.456.7890
  • (leer / null)
  • 1234567890

Gibt es eine einfache Möglichkeit, einen regulären Ausdruck zu verwenden, um dies zu tun? Ich suche nach dem besten Weg, dies zu tun. Gibt es einen besseren Weg?

Ich möchte die Nummer wie folgt neu formatieren: (123) 456-7890

Matt K.
quelle
3
Und welches davon ist Ihr Zielformat?
Bis Helge
Dieser: (123) 456-7890
Matt K
3
Ich würde sagen, entfernen Sie einfach alle nichtstelligen Zeichen und nehmen Sie dann drei Teilzeichenfolgen.
Wiseguy
2
@ Wiseguy bitte poste das als Antwort (mit einem Beispiel), da OP das wirklich tun sollte.
Brian Driscoll
1
Sie müssen auch angeben, wie jedes der akzeptierten Formate dem Zielformat zugeordnet wird, was bei einer Eingabe von null überhaupt nicht offensichtlich ist. Es sei denn, Sie sind bereit, eine zusätzliche Bedingung zu verwenden, um diesen Fall auszusortieren.
Jon

Antworten:

226

Angenommen, Sie möchten das Format " (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
}

Hier ist eine Version, die den optionalen +1internationalen Code zulässt :

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"
Maerics
quelle
2
Perfekt; Danke! Jedoch änderte ich return (!m) ? nullzu , return (!m) ? ""nachdem diese Funktion hinzugefügt wird .
Matt K
2
Eine schöne Lektion, wie man ein Problem angeht. Ich habe versucht zu überlegen, wie ich alle möglichen Fälle abgleichen kann - Sie eliminieren das Irrelevante und sehen, ob es eine Übereinstimmung gibt. Sehr schön.
Jkleg
2
Zu Ihrer Information, dies funktioniert nicht für Zahlen wie + 1555-555-5555
Will
'' + phoneNumberStringist das gleiche wie phoneNumberString... Es ist bereits eine Zeichenfolge.
YungGun
@YungGun, es sei denn, jemand ruft die Funktion mit einer Nummer auf, z. B.formatPhoneNumber(8001231234)
Maerics
32

Mögliche Lösung:

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
ioseb
quelle
Tolle Methode hier, danke!
Scottwsmyth
25

var x = '301.474.4062';
    
x = x.replace(/\D+/g, '')
     .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');

alert(x);

Sean Bright
quelle
1
Vielen Dank, Sean, ich mag deine kurze, einfache Inline-Lösung.
Benutzer752746
1
Danke dafür! Ich habe es so geändert, dass es x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');funktioniert, um zum Beispiel '+1' vor der Telefonnummer hinzuzufügen
Greg A
Vielen Dank! das ist nur ich brauchte
Albert Hidalgo
7

Diese Antwort basiert auf der Antwort der Maerics. Es unterscheidet sich hauptsächlich darin, dass es teilweise eingegebene Telefonnummern akzeptiert und die eingegebenen Teile formatiert.

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
David Baucum
quelle
Dies funktioniert während der Eingabe und fügt das gewünschte Format aus dem Quellposter hinzu. Nach 1,5 Stunden Suche bin ich froh, dass ich es versucht habe!
Pilzanthrax
Ich habe Klammern um die Vorwahl hinzugefügt, wenn das hilft:(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
Peter Hollingsworth
Eigentlich ist das Problem dann, dass Sie nicht über das '-' oder das Leerzeichen von der Mitte der Zeichenfolge zurücksetzen können. Sie müssen eine Neuformatierung verhindern, wenn der Benutzer einen Rückraum hat (z. B. newstring.length < oldstring.lengthODER, um die Cursorposition zu verfolgen und herauszufinden, wann der Benutzer gerade einen Abstand zwischen diesen Trennzeichen hat, z. B.if (cursorPosition === 4 && numericString.length > 3)
Peter Hollingsworth
In meinem Reaktionscode kann ich dies umgehen, indem ich intern nur die eingegebene Nummer speichere und dann formatiere, was in das Feld eingefügt wird. Die Rücktaste entfernt also das vorherige Zeichen im tatsächlichen Wert, nicht den angezeigten Wert.
David Baucum
5

Ich benutze diese Funktion, um US-Nummern zu formatieren.

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

Es werden fast alle denkbaren Möglichkeiten zum Schreiben einer US-Telefonnummer akzeptiert. Das Ergebnis wird in eine Standardform von (987) 654-3210 x123 formatiert

mikryz
quelle
3

rückwärts denken

Nehmen Sie nur die letzten Ziffern (bis zu 10) und ignorieren Sie die erste "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}`
}

Beispiel Eingabe / Ausgabe während der Eingabe

formatUSNumber('+1333')
// (333)

formatUSNumber('333')
// (333)

formatUSNumber('333444')
// (333) 444

formatUSNumber('3334445555')
// (333) 444-5555
Jason Sebring
quelle
1
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
Alex Turpin
quelle
0

Hier ist eine, die sowohl Telefonnummern als auch Telefonnummern mit Nebenstellen akzeptiert.

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
jjones
quelle
0

Mit diesen Funktionen können Sie gültige Telefonnummern überprüfen und normalisieren:

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;
}
Rodnier Borrego Clavero
quelle
0

Ich habe die Antwort von David Baucum um die Unterstützung von Erweiterungen mit einer Länge von bis zu 4 Stellen erweitert. Es enthält auch die in der ursprünglichen Frage angeforderten Klammern. Diese Formatierung funktioniert während der Eingabe in das Feld.

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;
Jeremy
quelle
0

Fast alle haben Probleme, wenn der Benutzer versucht, die Trennzeichen zurück zu drücken, insbesondere von der Mitte der Zeichenfolge aus.

Hier ist eine Abfragelösung, die dies erledigt und außerdem sicherstellt, dass der Cursor beim Bearbeiten an der richtigen Stelle bleibt:

//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 = '';        
    }
})
Peter Hollingsworth
quelle
-2

Für US-Telefonnummern

/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/

Lassen Sie uns diesen regulären Ausdruck in kleinere Fragmente unterteilen, damit er leicht verständlich wird.

  • /^\(?: Bedeutet, dass die Telefonnummer mit einer optionalen Nummer beginnen kann (.
  • (\d{3}): Nach dem optionalen (müssen 3 Ziffern stehen. Wenn die Telefonnummer keine hat (, muss sie mit 3 Ziffern beginnen. ZB (308oder 308.
  • \)?: Bedeutet, dass die Telefonnummer )nach den ersten 3 Ziffern optional sein kann .
  • [- ]?: Als nächstes kann die Telefonnummer -nach dem )Vorhandensein oder nach den ersten 3 Ziffern einen optionalen Bindestrich ( ) haben .
  • (\d{3}): Dann müssen 3 weitere Ziffern vorhanden sein. ZB (308)-135oder 308-135oder308135
  • [- ]?: Nach dem zweiten dreistelligen Satz kann die Telefonnummer einen weiteren optionalen Bindestrich ( -) haben. ZB (308)-135-oder 308-135-oder308135-
  • (\d{4})$/: Schließlich muss die Telefonnummer mit vier Ziffern enden. ZB (308)-135-7895oder 308-135-7895oder 308135-7895oder 3081357895.

    Referenz :

http://www.zparacha.com/phone_number_regex/

Bebu
quelle
1
Das Kopieren von Sachen von anderen Websites und das Nicht-Posten des Links ist ein ziemlich schlechtes Verhalten: zparacha.com/phone_number_regex
Till Helge
1
Es tut mir leid, ich hatte keine Ahnung, dass wir einen Link posten müssen. Ich dachte, wir müssen nur Antworten auf die gestellten Fragen geben.
Bebu
4
Es ist niemals in Ordnung, jemanden dazu zu bringen, wie Ihre eigene Arbeit auszusehen. Denken Sie beim nächsten Mal daran, dass das Posten von Links nichts auszusetzen hat, das Kopieren (insbesondere ohne Angabe eines Links) jedoch nicht. Und Sie haben immer die Möglichkeit, Ihre Antwort zu bearbeiten.
Bis Helge
Downvoted , weil der Autor antwortete nicht , wie ersetzen Sie die Telefonnummer wie der Autor angefordert.
BrianHVB