1056 Stimmen

Telefonnummern mit Regex validieren

Ich versuche, eine umfassende Regex zusammen zu setzen, um Telefonnummern zu validieren. Idealerweise würde es internationale Formate behandeln, aber es muss US-Formate, einschließlich der folgenden behandeln:

  • 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

Ich werde mit meinem derzeitigen Versuch antworten, aber ich hoffe, dass jemand etwas Besseres und/oder Eleganteres weiß.

550voto

scunliffe Punkte 60080

Bessere Option... einfach alle nicht-ziffrigen Zeichen bei der Eingabe entfernen (außer "x" und führende "+"-Zeichen), wobei man wegen der britischen Tendenz, Zahlen in der Nicht-Standardform zu schreiben, vorsichtig sein muss +44 (0) ... wenn Sie aufgefordert werden, die internationale Vorwahl zu verwenden (in diesem speziellen Fall sollten Sie die (0) vollständig).

Dann erhält man Werte wie:

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

Bei der Anzeige können Sie dann nach Herzenslust umformatieren, z. B.

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

333voto

Dave Kirby Punkte 429
.*

Wenn die Nutzer Ihnen ihre Telefonnummern geben wollen, dann vertrauen Sie ihnen, dass sie es richtig machen. Wenn sie sie Ihnen nicht geben wollen, dann zwingen Sie sie, eine gültige Nummer einzugeben, und schicken sie entweder auf die Website eines Konkurrenten oder lassen sie eine zufällige Zeichenkette eingeben, die zu Ihrem Regex passt. Ich könnte sogar versucht sein, die Nummer einer kostenpflichtigen Horoskop-Hotline nachzuschlagen und stattdessen diese einzugeben.

Ich würde auch jeden der folgenden Einträge auf einer Website als gültig betrachten:

"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"

332voto

Justin R. Punkte 22615

Es hat sich herausgestellt, dass es dafür eine Art Spezifikation gibt, zumindest für Nordamerika, die NANP .

Sie müssen genau angeben, was Sie wollen. Was sind zulässige Begrenzungszeichen? Leerzeichen, Bindestriche und Punkte? Ist kein Begrenzungszeichen erlaubt? Kann man Begrenzungszeichen mischen (z. B. +0.111-222.3333)? Wie werden Erweiterungen (z. B. 111-222-3333 x 44444) gehandhabt? Was ist mit Sonderrufnummern, wie 911? Wird die Ortsvorwahl optional oder obligatorisch sein?

Hier ist eine Regex für eine 7- oder 10-stellige Zahl, mit erlaubten Erweiterungen, Trennzeichen sind Leerzeichen, Bindestriche oder Punkte:

^(?:(?:\+?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+))?$

202voto

Halfwarr Punkte 7587

Ich würde auch vorschlagen, dass Sie sich die " libphon-Nummer " Google Bibliothek. Ich weiß, es ist nicht Regex, aber es tut genau das, was Sie wollen.

Zum Beispiel wird es das erkennen:

15555555555

ist eine mögliche Zahl, aber keine gültige Zahl. Es werden auch Länder außerhalb der USA unterstützt.

Highlights der Funktionalität:

  • Parsing/Formatierung/Validierung von Telefonnummern für alle Länder/Regionen der Welt.
  • getNumberType - erhält den Typ der Nummer anhand der Nummer selbst; kann zwischen Festnetz-, Mobilfunk-, gebührenfreien, Premium Rate-, Shared Cost-, VoIP- und persönlichen Nummern unterscheiden (sofern möglich).
  • isNumberMatch - liefert eine Aussage darüber, ob zwei Zahlen gleich sein könnten.
  • getExampleNumber / getExampleNumberByType - bietet gültige Beispielnummern für alle Länder/Regionen, wobei Sie angeben können, welche Art von Beispieltelefonnummer benötigt wird.
  • isPossibleNumber - schnelles Erraten, ob es sich bei einer Nummer um eine mögliche Phonennummer handelt, indem nur die Längeninformation verwendet wird, viel schneller als eine vollständige Validierung.
  • isValidNumber - vollständige Validierung einer Telefonnummer für eine Region anhand von Längen- und Vorwahlinformationen.
  • AsYouTypeFormatter - formatiert Telefonnummern on-the-fly, wenn der Benutzer die einzelnen Ziffern eingibt.
  • findNumbers - findet Zahlen in Texteingaben.
  • PhoneNumberOfflineGeocoder - liefert geografische Informationen zu einer Telefonnummer.

Beispiele

Das größte Problem bei der Validierung von Telefonnummern ist, dass sie sehr kulturabhängig ist.

  • Amerika
    • (408) 974–2042 ist eine gültig US-Nummer
    • (999) 974–2042 ist nicht gültig US-Nummer
  • Australien
    • 0404 999 999 ist eine gültig Australische Nummer
    • (02) 9999 9999 ist auch ein gültig Australische Nummer
    • (09) 9999 9999 ist nicht gültig Australische Nummer

Ein regulärer Ausdruck ist gut geeignet, um das Format einer Telefonnummer zu überprüfen, aber er ist nicht wirklich in der Lage, die Gültigkeit einer Rufnummer.

Ich würde vorschlagen, einen einfachen regulären Ausdruck zum Testen Ihrer Telefonnummer zu überspringen und eine Bibliothek wie die von Google zu verwenden libphonenumber (Link zum GitHub-Projekt) .

Wir stellen vor: libphonenumber!

Anhand eines Ihrer komplexeren Beispiele, 1-234-567-8901 x1234 erhalten Sie die folgenden Daten aus libphonenumber (Link zur Online-Demo) :

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

So erfahren Sie nicht nur, ob die Telefonnummer gültig ist (was der Fall ist), sondern Sie erhalten auch eine einheitliche Formatierung der Telefonnummer in Ihrem Land.

Als Bonus, libphonenumber verfügt auch über eine Reihe von Datensätzen zur Überprüfung der Gültigkeit von Telefonnummern, so dass die Überprüfung einer Nummer wie +61299999999 (die internationale Version von (02) 9999 9999 ) als gültige Zahl mit Formatierung zurück:

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 bietet darüber hinaus viele weitere Vorteile, wie z. B. die Erfassung des Standorts, an dem die Telefonnummer erkannt wird, und die Abfrage der Zeitzone:

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]

Aber die ungültige australische Rufnummer ( (09) 9999 9999 ) gibt zurück, dass es sich nicht um eine gültige Telefonnummer handelt.

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

Die Version von Google enthält Code für Java und Javascript, aber es wurden auch Bibliotheken für andere Sprachen implementiert, die den Google i18n-Telefonnummern-Datensatz verwenden:

Wenn Sie nicht sicher sind, dass Sie immer nur Nummern aus einem Gebietsschema akzeptieren und diese immer in einem Format vorliegen, würde ich dringend empfehlen, keinen eigenen Code dafür zu schreiben und libphonenumber für die Validierung und Anzeige von Telefonnummern zu verwenden.

92voto

Ismael Miguel Punkte 4021

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

Das passt:

 - (+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

Bei $n wird gespeichert:

  1. Länderindikator
  2. Rufnummer
  3. Erweiterung

Sie können es testen an https://regex101.com/r/kFzb1s/1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X