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ß.

11voto

GaiusSensei Punkte 1864

Dies ist ein einfaches Muster für reguläre Ausdrücke für philippinische Handynummern:

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

oder

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

werden mit diesen übereinstimmen:

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

Die erste passt auf JEDEN zweistelligen Ländercode, während die zweite ausschließlich auf den philippinischen Ländercode passt.

Testen Sie es hier: http://refiddle.com/1ox

11voto

ron0 Punkte 61

Wenn es um die Validierung von Formularen geht, wird die Regexp zur Überprüfung der korrekten Bedeutung und der korrekten Daten aufgrund der unterschiedlichen Länder- und Anbieterstandards äußerst komplex sein. Es wird auch schwer sein, sie auf dem neuesten Stand zu halten.

Ich interpretiere die Frage so, dass ein allgemein gültiges Muster gesucht wird, das möglicherweise intern nicht konsistent ist - z. B. wenn eine Reihe von Nummern gültig ist, aber nicht überprüft wird, ob die Fernleitung, die Vermittlungsstelle usw. dem gültigen Muster für die Landesvorwahl entspricht.

Nordamerika ist einfach, und für das Ausland ziehe ich es vor, ein "idiomatisches" Muster zu verwenden, das die Art und Weise abdeckt, wie die Menschen ihre Zahlen angeben und sich merken:

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

Das nordamerikanische Muster stellt sicher, dass, wenn eine Klammer enthalten ist, beide enthalten sind. Das internationale Muster berücksichtigt ein optionales anfängliches "+" und den Ländercode. Danach sind Sie im Idiom. Gültige Übereinstimmungen wären:

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

Dies mag voreingenommen sein, da sich meine Erfahrung auf Nordamerika, Europa und ein wenig Asien beschränkt.

10voto

mindplay.dk Punkte 6764

Mein Bauchgefühl wird durch die vielen Antworten zu diesem Thema bestätigt - es gibt eine praktisch unendliche Anzahl von Lösungen für dieses Problem, von denen keine elegant sein wird.

Ehrlich gesagt, würde ich Ihnen empfehlen, nicht zu versuchen, Telefonnummern zu überprüfen. Selbst wenn Sie einen großen, haarigen Validator schreiben könnten, der alle verschiedenen legitimen Formate zulässt, würde er am Ende so ziemlich alles zulassen, was auch nur annähernd einer Telefonnummer ähnelt.

Meiner Meinung nach besteht die eleganteste Lösung darin, eine Mindestlänge zu validieren, mehr nicht.

9voto

Adam Davis Punkte 89506

Sie werden es schwer haben, internationale Nummern mit einem einzigen/einfachen Regex zu behandeln, siehe diese Stelle über die Schwierigkeiten mit internationalen (und sogar nordamerikanischen) Telefonnummern.

Sie sollten die ersten paar Ziffern analysieren, um den Ländercode zu ermitteln, und dann je nach Land unterschiedlich vorgehen.

Darüber hinaus enthält die von Ihnen angeführte Liste ein weiteres gängiges US-Format nicht - das Weglassen der anfänglichen 1. Die meisten Mobiltelefone in den USA verlangen das nicht, und das wird die jüngere Generation verwirren, es sei denn, sie haben schon international telefoniert.

Sie haben richtig erkannt, dass es ein kniffliges Problem ist...

-Adam

8voto

Drew Thomas Punkte 147

Nach der Lektüre dieser Antworten sieht es so aus, als gäbe es keinen einfachen regulären Ausdruck, der einen Haufen Text analysieren und Telefonnummern in jedem Format (einschließlich international mit und ohne Pluszeichen) herausziehen kann.

Das hier habe ich kürzlich für ein Kundenprojekt verwendet, bei dem wir alle Telefonnummern in jedem Format in tel:-Links umwandeln mussten.

Bis jetzt hat es mit allem funktioniert, was sie ihm vorgeworfen haben, aber wenn Fehler auftreten, werde ich diese Antwort aktualisieren.

Regex:

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

PHP-Funktion zum Ersetzen aller Telefonnummern durch tel:-Links (für den Fall, dass jemand neugierig ist):

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

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