Eine umfassende Regex für die Überprüfung der Telefonnummer
Ich versuche, die zusammen eine umfassende regex zu validieren Telefonnummern. Ideal wäre es handle internationale Formate, aber es muss Griff US-Formate, einschließlich der folgenden:
- 1-234-567-8901
- 1-234-567-8901 x 1234
- 1-234-567-8901 ext1234
- 1 (234) 567-8901
- 1.234.567.8901
- 1/234/567/8901
- 12345678901
Ich Antworte mit meinem aktuellen Versuch, aber ich bin der Hoffnung, jemand hat etwas bessere und/oder elegantere Lösung.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bessere option... nur Streifen alle nicht-Ziffer-Zeichen auf der Eingabe (außer " x " und führenden '+' Zeichen), die Pflege, weil die britische Tendenz, zu schreiben, zahlen in der nicht-standard-form
+44 (0) ...
wenn Sie gefragt werden, verwenden Sie die internationale Vorwahl (in diesem speziellen Fall, sollten Sie verwerfen die(0)
vollständig).Dann, Sie am Ende mit Werten wie:
Dann, wenn Sie anzuzeigen, neu zu formatieren, um Ihre Herzen Inhalt. z.B.
InformationsquelleAutor der Antwort
Es stellt sich heraus, dass es so etwas wie eine spec für dieses, zumindest für Nord-Amerika, genannt der NANP.
Müssen Sie genau angeben, was Sie wollen. Was sind die rechtlichen Trennzeichen? Leerzeichen, Bindestriche und Punkte? Kein Trennzeichen erlaubt? Kann man mix-Trennzeichen (z.B., +0.111-222.3333)? Wie sind Erweiterungen (z.B., 111-222-3333 x an 44444 zu) gehandhabt? Was ist mit speziellen zahlen, wie 911? Ist die Vorwahl gehen, um optional oder erforderlich sein?
Hier ein regex für ein 7-oder 10-stellige Nummer, mit Erweiterungen erlaubt, Trennzeichen sind Leerzeichen, Bindestriche oder Punkte:
InformationsquelleAutor der Antwort
Wenn der Nutzer will, um dir seine Telefonnummer, dann Vertrauen Sie ihm, es richtig zu machen. Wenn er nicht will, um es dir zu geben, dann zwingt ihn zur Eingabe einer gültigen Nummer wird entweder schicken Sie ihn auf die Webseite eines mitbewerbers oder stellen Sie ihn in eine zufällige Zeichenfolge, die passt zu Ihrem regex. Ich könnte sogar versucht sein, sich die Nummer einer premium-rate-sex-line und geben Sie stattdessen.
Ich würde auch prüfen, die folgenden als gültige Einträge auf einer web-site:
InformationsquelleAutor der Antwort
Ich würde auch vorschlagen, mit Blick auf die "libphonenumber" Google-Bibliothek. Ich weiß, es ist nicht regex, aber es tut genau, was Sie wollen.
Zum Beispiel, wird es erkennen, dass:
ist eine mögliche Zahl, aber nicht eine gültige Zahl. Es unterstützt auch Länder außerhalb der USA.
Highlights der Funktionalität:
getNumberType
- bekommt der Typ die Zahl, basierend auf der Zahl selbst; in der Lage zu unterscheiden, Festnetz -, Mobilfunk -, Toll-free, Premium Rate, Shared Cost -, VoIP-und Personenbezogenen Nummern (wenn möglich).isNumberMatch
- wird ein Konfidenzniveau auf, ob zwei zahlen identisch sein könnte.getExampleNumber
/getExampleNumberByType
- gültige Beispiel-Nummern für alle Länder/Regionen, mit der option, die angibt, welche Art von Beispiel Telefonnummer ist erforderlich.isPossibleNumber
- schnell erraten, ob eine Zahl eine mögliche phonenumber, indem nur die Länge der information, viel schneller als eine vollständige Validierung.isValidNumber
- volle Validierung des Telefon-Nummer für eine region mit Länge und das Präfix Informationen.AsYouTypeFormatter
- Formate Telefonnummern on-the-fly, wenn Benutzer geben Sie die einzelnen Ziffern.findNumbers
- findet zahlen in der text-Eingabe.PhoneNumberOfflineGeocoder
- bietet geografische Informationen in Bezug auf eine Telefonnummer.Beispiele
Das größte problem, mit Telefonnummer-Validierung ist es ist sehr kulturell abhängig.
(408) 974–2042
ist ein gültig US-Nummer(999) 974–2042
ist keine gültige US-Nummer0404 999 999
ist ein gültig Australische Nummer(02) 9999 9999
ist auch ein gültig Australische Nummer(09) 9999 9999
ist keine gültige Australische NummerEinen regulären Ausdruck ist in Ordnung für das prüfen des formats einer Telefonnummer, aber es ist nicht wirklich in der Lage sein zu überprüfen, die Gültigkeit einer Telefonnummer.
Ich würde vorschlagen, überspringen Sie einen einfachen regulären Ausdruck zu testen Sie Ihre Telefon-Nummer vor, und die Verwendung einer Bibliothek wie Google
libphonenumber
(link zum GitHub-Projekt).Einführung libphonenumber!
Dass Sie eine der komplexeren Beispiele
1-234-567-8901 x1234
erhalten Sie die folgenden Daten aus demlibphonenumber
(link zur online-demo):Also nicht nur, dass Sie erfahren, ob die Telefonnummer gültig ist (was es ist), aber Sie bekommen auch die konsequente Telefon-Nummer-Formatierung in Ihrem Gebietsschema.
Als bonus
libphonenumber
hat eine Reihe von Datensätzen zur überprüfung der Gültigkeit der Telefon-Nummern sowie, so dass die überprüfung eine Zahl wie+61299999999
(die internationale version der(02) 9999 9999
) gibt als zulässige Zahl mit der Formatierung:libphonenumber gibt Ihnen auch viele zusätzliche Vorteile, wie beispielsweise die Ergreifung der Lage, die Rufnummer wird erkannt als, und auch immer die Zeitzonen-Informationen, von der Telefonnummer:
Aber die ungültige Australische Telefonnummer (
(09) 9999 9999
) gibt an, dass es nicht eine gültige Telefonnummer.Google-version hat code für Java und Javascript, aber die Leute haben auch umgesetzt Bibliotheken für andere Sprachen, die Verwendung der Google-i18n Telefonnummer dataset:
Es sei denn, Sie sind sicher, dass Sie immer akzeptiert werden zahlen von einem Gebietsschema, und Sie sind immer in einem format, würde ich stark empfehlen, nicht das schreiben Ihrer eigenen code, für diese, und mit libphonenumber für die Validierung und Anzeige von Telefonnummern.
InformationsquelleAutor der Antwort
/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i
Dies entspricht:
$N, es spart:
Können Sie testen Sie es auf https://www.regexpal.com/?fam=99127
InformationsquelleAutor der Antwort
Obwohl die Antwort auf alle strip whitespace ist ordentlich, es löst nicht wirklich das problem, das gestellt, was ist ein regex. Nehmen Sie, zum Beispiel, mein test-script, dass die downloads eine web-Seite und extrahiert alle Telefonnummern, die mit der regex. Da brauchen Sie einen regex sowieso, könnte man genauso gut die regex die Arbeit zu machen. Ich kam mit dieser:
Hier ist ein perl-Skript, um es zu testen. Wenn Sie übereinstimmen, $1 enthält die Vorwahl, $2 und $3 enthalten die Telefonnummer, und $5 enthält die Verlängerung. Mein test-Skript lädt eine Datei aus dem internet und druckt alle Telefonnummern drin.
Edit:
Können Sie ändern \W* \s*\W?\s* in der regex, ziehen Sie es ein wenig. Ich dachte nicht von dem regulären Ausdruck in Bezug auf, sagen wir, validieren von Benutzereingaben in einem Formular, wenn ich es geschrieben habe, aber diese änderung macht es möglich, verwenden Sie die regex für diesen Zweck.
InformationsquelleAutor der Antwort
Ich beantwortete diese Frage auf eine andere Frage ALSO, bevor Sie entscheiden, um auch meine Antwort als eine Antwort auf diesen thread, da wurde niemand Adressierung, wie Sie benötigen/erfordern keine Elemente, sondern nur die aushändigung regexs:
Regex arbeiten falsch, passende unerwartete Dinge
Von meinem post auf dieser Seite, habe ich einen quick guide zu helfen, jemand mit eigenen regex für Ihre eigene gewünschte Telefon-Nummer format, die ich als Nachteil (wie ich es Tat auf der anderen Seite) , wenn Sie zu restriktiv sind, erhalten Sie möglicherweise nicht die gewünschten Ergebnisse, und es gibt keine "one-size-fits-all" - Lösung zu akzeptieren, alle möglichen Telefonnummern in der Welt - nur das, was Sie sich entscheiden, zu akzeptieren als das format der Wahl. Verwenden Sie auf Ihr eigenes Risiko.
Schnelle Spickzettel
/^
[\s]
oder\s
[(]
und[)]
. Mit\(
und\)
ist hässlich und kann die Dinge verwirrend.?
nach-
oder[-]
. Wenn Sie es nicht erste oder Letzte in einer Reihe von anderen Zeichen, obwohl, müssen Sie möglicherweise, um es zu entkommen:\-
[-.\s]
benötigen einen Bindestrich, Punkt oder Leerzeichen. Ein Fragezeichen nach der letzten Klammer mit all diesen optional bei diesem slot.\d{3}
: Benötigt eine 3-stellige Zahl: 000-999. Die Kurzform für[0-9][0-9][0-9]
.[2-9]
: Erfordert eine Ziffer 2-9 für diesen slot.(\+|1\s)?
: Akzeptieren Sie ein "plus" oder ein 1-und ein Leerzeichen (pipe-Zeichen,|
ist "oder"), und machen es freiwillig. Die "plus" - Zeichen müssen escaped werden.[246]
erfordern eine 2, 4 oder 6.[77|78]
erfordern, 77 oder 78.$/
: Ende der AusdruckInformationsquelleAutor der Antwort
Schrieb ich einfachste (obwohl ich nicht brauchen, dot).
Wie unten erwähnt, es prüft nur für Zeichen, die nicht seine Struktur/Reihenfolge
InformationsquelleAutor der Antwort
Beachten Sie, dass die Strippen
()
Zeichen funktioniert nicht für einen Stil zu schreiben, Großbritannien zahlen, ist üblich:+44 (0) 1234 567890
was bedeutet, Zifferblatt entweder die internationale Nummer:+441234567890
oder in Großbritannien Zifferblatt
01234567890
InformationsquelleAutor der Antwort
Wenn Sie nur wollen, um sicherzustellen, dass Sie nicht haben zufällige Zeichen in das Feld ein (d.h., von der form Spammer) dieser regex sollte gut tun:
Beachten Sie, dass es keine speziellen Regeln, wie viele Ziffern, oder, was zahlen sind gültig in diesen stellen, es gerade überprüft, dass nur Ziffern, Klammern, Bindestriche, plus, space, Pfund, Sternchen, Punkt, Komma, oder die Buchstaben
e
x
t
vorhanden sind.Sollte es kompatibel sein mit den internationalen zahlen und Lokalisierung-Formate. Sehen Sie müssen es erlauben, eckigen, geschweiften oder Spitzen Klammern für einige Regionen? (derzeit sind Sie nicht im Lieferumfang enthalten).
Wenn Sie wollen, erhalten pro digit-Regeln (wie in US-Vorwahlen und Präfixe (exchange-codes) fallen muss, im Bereich von 200-999) naja, viel Glück für Sie. Die Aufrechterhaltung eines komplexen Regel-set, das könnte veraltet sein beliebigen Zeitpunkt in der Zukunft, die von jedem Land in der Welt, klingt nicht lustig.
Und beim Strippen alle/die meisten nicht-numerischen Zeichen können auch auf der server-Seite (vor allem, wenn Sie planen, auf die Weitergabe dieser Werte an eine dialer), können Sie nicht wollen, thrash die Eingabe des Benutzers bei der Validierung, besonders, wenn Sie wollen, um Korrekturen in einem anderen Feld.
InformationsquelleAutor der Antwort
Haben Sie schon einen Blick auf RegExLib?
Eingabe Sie UNS an unter Telefon Nummer brachte wieder eine ganze Liste von Möglichkeiten.
InformationsquelleAutor der Antwort
Fand ich diese ganz gut zu funktionieren:
Funktioniert es für diese Anzahl Formate:
Stellen Sie sicher, dass die Globale UND multiline-flags sicher zu stellen.
Link: http://www.regexr.com/3bp4b
InformationsquelleAutor der Antwort
Wenn du redest, Formular-Validierung, die regexp zu validieren, die korrekte Bedeutung sowie korrekte Daten äußerst Komplex wegen der unterschiedlichen Land und Anbieter standards. Es wird auch schwer zu halten up-to-date.
Interpretiere ich die Frage als Suche nach einem allgemein gültigen Muster, die möglicherweise nicht intern konsistent ist - zum Beispiel mit einer gültigen Satz von zahlen, aber nicht die überprüfung, dass die trunk-line, exchange, etc. der gültige Muster für die Ländercode-Präfix.
Nordamerika ist unkompliziert und für internationale bevorzuge ich ein 'idiomatischer' Muster, das umfasst die Möglichkeiten, in denen Menschen angeben, und denken Sie daran, Ihre zahlen:
Dem nordamerikanischen Muster stellt sicher, dass wenn eine Klammer enthalten ist sind beide. Die internationalen Konten für eine optionale erste '+' und Ländervorwahl. Danach sind Sie in der Redewendung. Gültige Spiele wäre:
(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
Diese vorgespannt sein, so meine Erfahrung beschränkt sich auf Nordamerika, Europa und ein wenig Asien.
InformationsquelleAutor der Antwort
Mein Versuch einer uneingeschränkten regex:
Akzeptiert:
Ablehnt:
Es ist bis zu Ihnen, zum desinfizieren, für die Anzeige. Nach der überprüfung es könnte eine Anzahl obwohl.
InformationsquelleAutor der Antwort
Dies ist ein einfaches Muster für Reguläre Ausdrücke für die Philippinischen Handy-Nummern:
oder
wird mit den folgenden übereinstimmen:
Wird das erste Spiel JEDER zweistelligen Ländercode, während der zweite wird mit dem Philippinischen Land code ausschließlich.
Test gibt es hier: http://refiddle.com/1ox
InformationsquelleAutor der Antwort
Mein Gefühl wird noch verstärkt durch die Menge der Antworten zu diesem Thema -, dass es eine praktisch unendliche Anzahl von Lösungen für dieses problem, keiner von denen geht, elegant zu sein.
Ehrlich, ich würde empfehlen, Sie versuchen nicht validieren von Telefonnummern. Auch wenn Sie schreiben, könnte eine große, haarige validator, die es ermöglichen würde, alle die verschiedenen legitimen Formate, es würde enden, so dass so ziemlich alles, was auch nur im entferntesten wie eine Telefonnummer in den ersten Platz.
Meiner Meinung nach, die eleganteste Lösung ist, um zu validieren, die eine minimale Länge, nichts mehr.
InformationsquelleAutor der Antwort
Haben Sie eine harte Zeit den Umgang mit internationalen zahlen mit einer einzelnen/einfachen regex, siehe dieser Beitrag auf die Schwierigkeiten des internationalen (und auch nordamerikanischen) Telefonnummern.
Werden Sie wollen, um eine Analyse der ersten paar Ziffern zu bestimmen, was das Land code ist, dann anders handeln, basierend auf dem Land.
Darüber hinaus die Liste, die Sie gab nicht einen gemeinsamen US-format - verlassen der initial-1. Die meisten Handys in den USA nicht erforderlich ist es, und es wird anfangen zu verblüffen, die jüngere generation, es sei denn, Sie haben gewählt International.
Das hast du richtig erkannt, es ist ein heikles problem...
-Adam
InformationsquelleAutor der Antwort
Nach dem Lesen dieser Antworten, es sieht aus wie es war nicht eine einfache reguläre Ausdrücke, die analysieren können durch ein Bündel von text und ziehen Sie die Telefonnummern in jedem beliebigen format (einschließlich der international mit und ohne plus-Zeichen).
Hier ist, was ich für ein Kundenprojekt vor kurzem, wo wir konvertieren alle Telefonnummern, die in einem beliebigen format von tel: - links.
So weit, es arbeitet mit alles, was Sie geworfen haben, aber wenn Fehler kommen, ich werde zu aktualisieren, diese Antwort.
Regex:
/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/
PHP Funktion zu ersetzen, die alle Telefonnummern, die mit tel: - links (falls jemand neugierig ist):
InformationsquelleAutor der Antwort
Hier ist eine wunderbare Muster, dass die meisten eng aufeinander abgestimmt werden, die überprüfung, die ich brauchte, um zu erreichen. Ich bin nicht der ursprüngliche Autor, aber ich denke, es lohnt sich zu teilen wie ich dieses problem sehr Komplex und ohne eine präzise oder allgemein nützliche Antwort.
Folgende regex fängt allgemein verwendete Zahl-und Zeichen-Kombinationen in einer Vielzahl internationaler Telefonnummer-Formate:
/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm
Positiv:
+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
Negativ:
926 3 4
8 800 600-APPLE
Original-Quelle: http://www.regexr.com/38pvb
InformationsquelleAutor der Antwort
Hier ist mein bestes bisher. Es verarbeitet die Formate oben, aber ich bin sicher, ich bin fehlen einige andere Formate möglich.
InformationsquelleAutor der Antwort
Glaube ich, dass die Anzahl::Telefon::US und Regexp::Common (besonders die Quelle der Regexp::Common::URI::RFC2806) Perl-Module helfen könnte.
Die Frage sollte wohl angegeben werden, in ein wenig mehr detail zu erklären, den Zweck der überprüfung der zahlen. Zum Beispiel, 911 ist eine gültige Zahl in den USA, aber 911x ist nicht für jeden Wert von x an. Das ist so, dass die Handy-Unternehmen berechnen können, wenn Sie fertig sind, wählen. Es gibt mehrere Varianten zu diesem Thema. Aber deine regex funktioniert nicht prüfen Sie die Vorwahl Teil, also das scheint nicht von Belang sein.
Wie Validierung von E-Mail-Adressen, selbst wenn Sie mit einem gültigen Ergebnis können Sie nicht wissen, ob es zugeordnet ist, jemand, bis Sie es versuchen.
Wenn Sie versuchen, um Benutzereingaben zu überprüfen, warum nicht das Ergebnis normalisieren und mit ihm getan werden? Wenn der Benutzer legt in einer Nummer, die Sie nicht erkennen können, wie eine gültige Zahl, entweder speichern Sie es als eingegeben oder Streifen aus undailable Zeichen. Die Anzahl::Telefon::Normalize Perl-Modul kann eine Quelle der inspiration.
InformationsquelleAutor der Antwort
Arbeite ich für ein Marktforschungsinstitut und wir filtern diese Arten von input alllll die Zeit. Sie erschweren es zu viel. Nur Streifen, die nicht-alphanumerische Zeichen, und sehen, ob es eine Verlängerung.
Zur weiteren Analyse können Sie sich in einer der vielen Anbieter, die Ihnen Zugang zu einer Datenbank von gültigen zahlen, sowie Ihnen sagen, wenn Sie über das Festnetz oder Mobiltelefone, abschalten, etc. Es kostet Geld.
InformationsquelleAutor der Antwort
Tun ersetzen die Formatierung von Zeichen, dann check die restlichen für Handy Gültigkeit. In PHP,
Brechen einen komplexen regexp wie diese können genauso effektiv, aber viel einfacher.
InformationsquelleAutor der Antwort
Ich fand, dass das etwas Interessantes. Ich habe es nicht getestet, aber es sieht aus als ob es funktionieren würde
InformationsquelleAutor der Antwort
Würden Sie wahrscheinlich besser dran mit einer Maskierten Eingabe für diesen. So können die Benutzer NUR zahlen eingeben und Sie können das format aber Sie sehen, passen. Ich bin mir nicht sicher, ob dies für eine web-Anwendung, aber wenn es ist, es ist eine sehr auf jQuery-plugin bietet einige Optionen HIERFÜR.
http://digitalbush.com/projects/masked-input-plugin/
Sie selbst, wie die Maske Telefonnummer Eingänge in Ihrem tutorial.
InformationsquelleAutor der Antwort
Hier ist eine, die funktioniert gut in JavaScript. Es ist in eine Zeichenfolge, weil das ist, was die Dojo-widgets, die erwartet wurde.
Es entspricht einer 10-stelligen Nordamerika NANP-Nummer mit optionaler Verlängerung. Leerzeichen, Bindestriche und Punkte werden akzeptiert Trennzeichen.
InformationsquelleAutor der Antwort
Ich war kämpfen mit dem gleichen Problem versucht zu machen, meine Bewerbung für die Zukunft gerüstet ist, aber diese Jungs haben mich in die richtige Richtung gehen. Ich bin eigentlich nicht der überprüfung der Zahl selbst, um zu sehen, ob es klappt oder nicht, ich versuche nur, um sicherzustellen, dass Sie eine Reihe von zahlen eingegeben wurde, die möglicherweise oder möglicherweise nicht über eine Erweiterung.
Worst-case-Szenario, wenn der Benutzer ziehen musste, eine unformatierte Zahl, die von der XML-Datei würden Sie immer noch geben Sie einfach die Nummern in das Telefon-numberpad
012345678x5
kein wirklicher Grund, es zu behalten ziemlich. Diese Art von RegEx wäre so etwas für mich:01234467 extension 123456
01234567x123456
01234567890
InformationsquelleAutor der Antwort
Meine Neigung ist zu vereinbaren, dass die Strippen nicht-Ziffern und einfach zu akzeptieren, was da am besten ist. Vielleicht, um sicherzustellen, mindestens ein paar Ziffern vorhanden sind, obwohl es verbieten, so etwas wie ein alphabetisches Telefon-Nummer "FRAGEN-JAKE" zum Beispiel.
Ein paar einfache perl-Ausdrücke können sein:
Zuerst verwenden halten Sie die Ziffer-Gruppen zusammen, die möglicherweise geben die Formatierung hinweisen. Verwenden Sie die zweite zu trivial werfen alle nicht-Ziffern.
Ist es eine Sorge, dass es notwendig sein kann, eine pause und dann weitere Tasten eingegeben? Oder so etwas wie 555-1212 (warten Sie auf den Piepton) 123?
InformationsquelleAutor der Antwort
Muss mit einer Ziffer enden, beginnen können, mit ( oder + oder eine Ziffer, und kann enthalten + - ( oder )
InformationsquelleAutor der Antwort
Beispiel für die Türkei, ändern Sie einfach die
ganz nach Ihren Bedürfnissen und starten Sie es.
InformationsquelleAutor der Antwort