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

66voto

indiv Punkte 16498

Obwohl die Antwort, alle Leerzeichen zu entfernen, nett ist, löst sie nicht wirklich das Problem, das gestellt wurde, nämlich eine Regex zu finden. Nehmen Sie z. B. mein Testskript, das eine Webseite herunterlädt und alle Telefonnummern mit Hilfe der Regex extrahiert. Da man sowieso eine Regex braucht, kann man auch gleich die Regex die ganze Arbeit machen lassen. Ich habe mir dies ausgedacht:

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

Hier ist ein Perl-Skript, um es zu testen. Wenn Sie übereinstimmen, enthält $1 die Vorwahl, $2 und $3 die Telefonnummer und $5 die Durchwahl. Mein Testskript lädt eine Datei aus dem Internet herunter und gibt alle darin enthaltenen Telefonnummern aus.

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';

my @tests =
(
"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",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

Edit :

Sie können ändern \W * bis \s * \W ? \s * in der Regex, um sie ein wenig zu straffen. Ich dachte nicht an die Regex in Bezug auf, sagen wir, die Validierung von Benutzereingaben in einem Formular, als ich es schrieb, aber diese Änderung macht es möglich, die Regex für diesen Zweck zu verwenden.

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';

58voto

vapcguy Punkte 6445

Ich habe diese Frage in einer anderen SO-Frage beantwortet, bevor ich mich entschied, meine Antwort auch als Antwort in diesen Thread aufzunehmen, weil niemand darauf einging, wie man Elemente benötigt/nicht benötigt, sondern nur Regexe verteilt: Regex arbeitet falsch, passt auf unerwartete Dinge

Ausgehend von meinem Beitrag auf dieser Website habe ich eine Kurzanleitung erstellt, die jedem dabei helfen soll, eine eigene Regex für das gewünschte Telefonnummernformat zu erstellen. Ich möchte jedoch (wie schon auf der anderen Website) darauf hinweisen, dass Sie möglicherweise nicht die gewünschten Ergebnisse erzielen, wenn Sie zu restriktiv vorgehen, und dass es keine "Einheitslösung" gibt, die alle möglichen Telefonnummern der Welt akzeptiert - nur das, was Sie als Ihr bevorzugtes Format akzeptieren wollen. Die Verwendung erfolgt auf eigene Gefahr.

Kurzer Spickzettel

  • Beginnen Sie den Ausdruck: /^
  • Wenn Sie einen Raum benötigen, verwenden Sie: [\s] oder \s
  • Wenn Sie Klammern benötigen, verwenden Sie: [(] y [)] . Verwendung von \( y \) ist hässlich und kann für Verwirrung sorgen.
  • Wenn Sie wollen, dass etwas optional ist, setzen Sie ein ? danach
  • Wenn Sie einen Bindestrich wünschen, geben Sie einfach - oder [-] . Wenn Sie es jedoch nicht an den Anfang oder an das Ende einer Reihe von anderen Zeichen setzen, müssen Sie es möglicherweise auslassen: \-
  • Wenn Sie verschiedene Optionen in einem Slot akzeptieren wollen, setzen Sie Klammern um die Optionen: [-.\s] erfordert einen Bindestrich, einen Punkt oder ein Leerzeichen. Ein Fragezeichen nach der letzten Klammer macht alle diese Angaben für diesen Slot optional.
  • \d{3} : Erfordert eine dreistellige Nummer: 000-999. Abkürzung für [0-9][0-9][0-9] .
  • [2-9] : Erfordert eine Ziffer 2-9 für diesen Steckplatz.
  • (\+|1\s)? : Akzeptieren Sie ein "Plus" oder eine 1 und ein Leerzeichen (Pipe-Zeichen), | , ist "oder"), und machen Sie es optional. Das "Plus"-Zeichen muss escaped werden.
  • Wenn Sie möchten, dass bestimmte Zahlen mit einem Steckplatz übereinstimmen, geben Sie diese ein: [246] erfordert eine 2, 4 oder 6. (?:77|78) oder [77|78] wird 77 oder 78 erfordern.
  • $/ : Beende den Ausdruck

34voto

Artjom Kurapov Punkte 6025

Ich habe simpliest geschrieben (obwohl ich den Punkt nicht brauchte).

^(\[0-9\\(\\)\\/\\+ \\-\]\*)$

Wie unten erwähnt, werden nur die Zeichen geprüft, nicht aber deren Struktur/Ordnung

23voto

Ben Clifford Punkte 1368

Beachten Sie, dass das Abziehen () Zeichen funktioniert nicht für die im Vereinigten Königreich übliche Schreibweise von Zahlen: +44 (0) 1234 567890 das heißt, wählen Sie entweder die internationale Nummer:
+441234567890
oder im Vereinigten Königreich wählen Sie 01234567890

22voto

Steve Punkte 106

Wenn Sie nur sicherstellen wollen, dass Sie keinen zufälligen Müll im Feld haben (z. B. von Formular-Spammern), sollte diese Regex ausreichen:

^[0-9+\(\)#\.\s\/ext-]+$

Beachten Sie, dass es keine speziellen Regeln dafür gibt, wie viele Ziffern oder welche Ziffern in diesen Ziffern gültig sind, es wird lediglich überprüft, dass nur Ziffern, Klammern, Bindestriche, Plus, Leerzeichen, Pfund, Sternchen, Punkt, Komma oder die Buchstaben e , x , t vorhanden sind.

Sie sollte mit internationalen Nummern und Lokalisierungsformaten kompatibel sein. Sehen Sie die Notwendigkeit, eckige, geschweifte oder schräge Klammern für einige Regionen zuzulassen? (derzeit sind sie nicht enthalten).

Wenn Sie Regeln für einzelne Ziffern beibehalten wollen (wie z. B. in den USA müssen Ortsvorwahlen und Vorwahlen (Amtskennziffern) in den Bereich 200-999 fallen), dann viel Glück für Sie. Die Beibehaltung eines komplexen Regelsatzes, der zu jedem beliebigen Zeitpunkt in der Zukunft von jedem Land der Welt überholt werden könnte, macht keinen Spaß.

Und während das Entfernen aller/der meisten nicht-numerischen Zeichen auf der Serverseite gut funktionieren kann (vor allem, wenn Sie planen, diese Werte an einen Dialer weiterzugeben), möchten Sie die Benutzereingabe während der Validierung vielleicht nicht zerdrücken, vor allem, wenn Sie möchten, dass der Benutzer in einem anderen Feld Korrekturen vornimmt.

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