wake-up-neo.com

Ein umfassender regulärer Ausdruck für die Validierung von Telefonnummern

Ich versuche, eine umfassende Regex zusammenzustellen, um Telefonnummern zu validieren. Idealerweise werden internationale Formate unterstützt, aber es müssen US-Formate unterstützt werden, einschließlich der folgenden:

  • 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 aktuellen Versuch antworten, aber ich hoffe, dass jemand etwas besseres und/oder eleganteres hat.

884

Bessere Option ... entfernen Sie einfach alle nicht-stelligen Zeichen bei der Eingabe (außer 'x' und führende '+'), und achten Sie auf die britische Tendenz, Zahlen in der nicht-standardmäßigen Form +44 (0) ... zu schreiben, wenn Sie dazu aufgefordert werden Um das internationale Präfix zu verwenden (in diesem speziellen Fall sollten Sie den (0) vollständig verwerfen).

Dann erhalten Sie Werte wie:

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

Wenn Sie dann anzeigen, formatieren Sie nach Herzenslust neu. z.B.

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

Es stellt sich heraus, dass es dafür eine Art Spezifikation gibt, zumindest für Nordamerika, genannt NANP .

Sie müssen genau angeben, was Sie wollen. Was sind gesetzliche Begrenzer? Leerzeichen, Striche und Punkte? Kein Trennzeichen erlaubt? Kann man Trennzeichen (z. B. +0,111-222,3333) mischen? Wie werden Erweiterungen (z. B. 111-222-3333 x 44444) behandelt? Was ist mit Sondernummern wie 911? Ist die Vorwahl optional oder erforderlich?

Hier ist ein regulärer Ausdruck für eine 7- oder 10-stellige Zahl, wobei Erweiterungen zulässig sind. Begrenzer 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+))?$
294
Justin R.
.*

Wenn der Benutzer Ihnen seine Telefonnummer mitteilen möchte, dann vertrauen Sie ihm, dass er es richtig macht. Wenn er es Ihnen nicht geben möchte, wird er entweder zur Eingabe einer gültigen Nummer gezwungen, um die Website eines Mitbewerbers aufzurufen, oder eine zufällige Zeichenfolge eingeben, die zu Ihrer Regex passt. Ich könnte sogar versucht sein, die Nummer einer Premium-Sex-Linie nachzuschlagen und diese stattdessen einzugeben.

Ich würde auch Folgendes als gültigen Eintrag auf einer Website 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"
289
Dave Kirby

Ich würde auch vorschlagen, sich die " libphonenumber " Google-Bibliothek anzusehen. Ich weiß, es ist kein regulärer Ausdruck, aber es macht genau das, was Sie wollen.

Zum Beispiel erkennt es, dass:

_15555555555
_

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

Highlights der Funktionalität:

  • Analysieren/Formatieren/Validieren von Telefonnummern für alle Länder/Regionen der Welt.
  • getNumberType - Ermittelt den Typ der Nummer basierend auf der Nummer selbst; Festnetz-, Mobilfunk-, gebührenfreie, Premium-Tarif-, Shared-Cost-, VoIP- und persönliche Nummern unterscheiden (wann immer möglich).
  • isNumberMatch - Gibt an, ob zwei Zahlen gleich sein können.
  • getExampleNumber/getExampleNumberByType - bietet gültige Beispielnummern für alle Länder/Regionen mit der Option, anzugeben, welche Art von Beispieltelefonnummer benötigt wird.
  • isPossibleNumber - schnelles Erraten, ob eine Nummer eine mögliche Telefonnummer ist, indem nur die Längeninformationen verwendet werden, viel schneller als eine vollständige Validierung.
  • isValidNumber - Vollständige Validierung einer Telefonnummer für eine Region unter Verwendung von Längen- und Präfixinformationen.
  • AsYouTypeFormatter - formatiert Telefonnummern im laufenden Betrieb, wenn Benutzer die einzelnen Ziffern eingeben.
  • findNumbers - Findet Zahlen in der Texteingabe.
  • PhoneNumberOfflineGeocoder - Liefert geografische Informationen zu einer Telefonnummer.

Beispiele

Das größte Problem bei der Validierung von Telefonnummern ist die starke kulturelle Abhängigkeit.

  • Amerika
    • _(408) 974–2042_ ist eine gültige US-Nummer
    • _(999) 974–2042_ ist keine gültige US-Nummer
  • Australien
    • _0404 999 999_ ist eine gültige australische Nummer
    • _(02) 9999 9999_ ist auch eine gültige australische Nummer
    • _(09) 9999 9999_ ist keine gültige australische Nummer

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

Ich würde vorschlagen, einen einfachen regulären Ausdruck zu überspringen, um Ihre Telefonnummer zu testen, 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 stammen 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 es ist), sondern Sie erhalten auch eine einheitliche Formatierung der Telefonnummer in Ihrem Gebietsschema.

Als Bonus verfügt libphonenumber über eine Reihe von Datensätzen, mit denen die Gültigkeit von Telefonnummern überprüft werden kann. Überprüfen Sie daher eine Zahl wie _+61299999999_ (die internationale Version von (02) 9999 9999 ) liefert als gültige Zahl mit Formatierung:

_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 Ihnen außerdem viele zusätzliche Vorteile, z. B. das Auffinden des Ortes, an dem die Telefonnummer erkannt wurde, und das Abrufen der Zeitzoneninformationen von der Telefonnummer:

_PhoneNumberOfflineGeocoder Results
Location        Australia

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

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

_Validation Results

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

Googles Version enthält Code für Java und Javascript, es wurden jedoch auch Bibliotheken für andere Sprachen implementiert, die den Google i18n-Telefonnummerndatensatz verwenden:

Sofern Sie nicht sicher sind, dass Sie immer Nummern von 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.

159
Halfwarr

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

Dies entspricht:

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

Auf $ n spart es:

  1. Länderindikator
  2. Telefonnummer
  3. Erweiterung

Sie können es unter https://www.regexpal.com/?fam=99127 testen

73
Ismael Miguel

Obwohl die Antwort, alle Leerzeichen zu entfernen, ordentlich ist, löst sie nicht wirklich das Problem, das sich stellt, nämlich einen regulären Ausdruck zu finden. Nehmen wir zum Beispiel mein Testskript, das eine Webseite herunterlädt und alle Telefonnummern mit dem regulären Ausdruck extrahiert. Da Sie sowieso einen regulären Ausdruck benötigen, können Sie den regulären Ausdruck die ganze Arbeit erledigen lassen. Das habe ich mir 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 druckt alle darin enthaltenen Telefonnummern.

#!/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";
        }
}

Bearbeiten:

Sie können\W * in\s *\W?\S * in der Regex ändern, um sie etwas zu verschärfen. Ich habe nicht an den regulären Ausdruck gedacht, um beispielsweise Benutzereingaben in einem Formular zu überprüfen, als ich ihn schrieb, aber diese Änderung ermöglicht es, den regulären Ausdruck 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*))?';
63
indiv

Ich habe diese Frage auf eine andere SO Frage beantwortet, bevor ich mich dazu entschlossen habe, meine Antwort als Antwort auf diesen Thread aufzunehmen, da sich niemand damit befasst hat, wie man Artikel benötigt/nicht benötigt, sondern nur reguläre Ausdrücke verteilt: Regex arbeitet falsch und passt zu unerwarteten Dingen

Aus meinem Beitrag auf dieser Website habe ich eine Kurzanleitung erstellt, die jedem dabei hilft, einen eigenen regulären Ausdruck für das von ihm gewünschte Telefonnummernformat zu erstellen. Ich werde darauf hinweisen (wie auf der anderen Website), dass Sie, wenn Sie zu restriktiv sind, Möglicherweise erzielen Sie nicht die gewünschten Ergebnisse, und es gibt keine "Einheitsgröße" -Lösung für die Annahme aller möglichen Telefonnummern auf der Welt - nur das, was Sie als Format Ihrer Wahl akzeptieren. Benutzung auf eigene Gefahr.

Schneller Spickzettel

  • Starten Sie den Ausdruck: /^
  • Wenn Sie ein Leerzeichen benötigen, verwenden Sie: [\s] oder \s
  • Wenn Sie Klammern benötigen, verwenden Sie: [(] und [)]. Die Verwendung von \( und \) ist hässlich und kann zu Verwirrung führen.
  • Wenn Sie möchten, dass etwas optional ist, fügen Sie einen ? hinzu
  • Wenn Sie einen Bindestrich wünschen, geben Sie einfach - oder [-] ein. Wenn Sie es jedoch nicht als erstes oder letztes in eine Reihe anderer Zeichen einfügen, müssen Sie es möglicherweise maskieren: \-
  • Wenn Sie in einem Slot unterschiedliche Optionen akzeptieren möchten, setzen Sie die Optionen in Klammern: [-.\s] erfordert einen Bindestrich, einen Punkt oder ein Leerzeichen. Ein Fragezeichen nach der letzten Klammer macht alle diese Angaben für diesen Steckplatz optional.
  • \d{3}: Erfordert eine 3-stellige 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 maskiert werden.
  • Wenn Sie möchten, dass bestimmte Nummern mit einem Steckplatz übereinstimmen, geben Sie diese ein: [246] erfordert eine 2, 4 oder 6. [77|78] erfordert 77 oder 78.
  • $/: Beendet den Ausdruck
41
vapcguy

Ich schrieb am einfachsten (obwohl ich keinen Punkt darin brauchte).

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

Wie weiter unten erwähnt, wird nur nach Zeichen gesucht, nicht nach ihrer Struktur/Reihenfolge

28
Artjom Kurapov

Beachten Sie, dass das Entfernen von () -Zeichen für einen gängigen Schreibstil für UK-Nummern nicht funktioniert: +44 (0) 1234 567890 Das bedeutet, dass Sie eine der folgenden internationalen Nummern wählen:
+441234567890
oder in Großbritannien wählen Sie 01234567890

22
Ben Clifford

Wenn Sie nur überprüfen möchten, dass Sie keinen zufälligen Müll im Feld haben (d. H. Von Formularspammern), sollte dieser reguläre Ausdruck gut funktionieren:

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

Beachten Sie, dass es keine speziellen Regeln für die Anzahl oder Gültigkeit der Ziffern gibt. Es wird lediglich überprüft, ob nur Ziffern, Klammern, Bindestriche, Pluszeichen, Leerzeichen, Raute, Sternchen, Punkte, Kommas oder Buchstaben vorhanden sind e, x, t sind vorhanden.

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

Wenn Sie die Regeln für die einzelnen Ziffern beibehalten möchten (z. B. in den US-Vorwahlen und Vorwahlen (Exchange Codes) müssen im Bereich von 200-999 liegen), wünschen Sie viel Glück. Es macht keinen Spaß, einen komplexen Regelsatz beizubehalten, der von jedem Land der Welt zu irgendeinem Zeitpunkt in der Zukunft veraltet sein könnte.

Und während das Entfernen aller/der meisten nicht-numerischen Zeichen auf der Serverseite möglicherweise gut funktioniert (insbesondere, wenn Sie diese Werte an einen Dialer übergeben möchten), möchten Sie möglicherweise die Benutzereingaben während der Überprüfung nicht verfälschen, insbesondere, wenn Sie dies möchten Korrekturen in einem anderen Bereich vornehmen.

21
Steve

Haben Sie sich RegExLib angesehen?

Die Eingabe der US-Telefonnummer brachte eine ganze Liste von Möglichkeiten.

15
Rob Wells

Ich fand das ganz gut:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

Es funktioniert für diese Zahlenformate:

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
1-234-567-8901 ext. 1234
(+351) 282 433 5050

Stellen Sie sicher, dass Sie globale UND mehrzeilige Flags verwenden.

Link: http://www.regexr.com/3bp4b

12

Mein Versuch einer uneingeschränkten Regex:

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/

Akzeptiert:

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww

Lehnt ab:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

Sie müssen es für die Anzeige desinfizieren. Nach der Validierung könnte eine Zahl sein.

12
ReactiveRaven

Wenn Sie über die Formularvalidierung sprechen, wird der reguläre Ausdruck zur Validierung der korrekten Bedeutung sowie der korrekten Daten aufgrund unterschiedlicher Länder- und Anbieterstandards äußerst komplex sein. Es wird auch schwierig sein, auf dem Laufenden zu bleiben.

Ich interpretiere die Frage so, dass nach einem allgemein gültigen Muster gesucht wird, das möglicherweise intern nicht konsistent ist - beispielsweise mit einem gültigen Satz von Zahlen, ohne jedoch zu validieren, dass die Amtsleitung, die Vermittlung usw. das gültige Muster für das Ländercode-Präfix enthält .

Nordamerika ist unkompliziert, und ich bevorzuge es, im internationalen Bereich ein "idiomatisches" Muster zu verwenden, das die Art und Weise abdeckt, in der 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 Konto enthält ein optionales anfängliches "+" und einen Ländercode. Danach sind Sie in der Redewendung. 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 kann voreingenommen sein, da meine Erfahrung auf Nordamerika, Europa und ein kleines Stück Asien beschränkt ist.

11
ron0

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}

passt zu diesen:

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

Der erste stimmt mit JEDEM zweistelligen Ländercode überein, während der zweite ausschließlich mit dem philippinischen Ländercode übereinstimmt.

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

10
GaiusSensei

Mein Bauchgefühl wird durch die zahlreichen Antworten auf dieses Thema untermauert - es gibt praktisch unendlich viele Lösungen für dieses Problem, von denen keine elegant sein wird.

Ehrlich gesagt würde ich empfehlen, dass Sie nicht versuchen, Telefonnummern zu validieren. Selbst wenn Sie einen großen, haarigen Prüfer schreiben könnten, der all die verschiedenen legitimen Formate zulässt, würde er am Ende so ziemlich alles zulassen, was auch nur aus der Ferne einer Telefonnummer ähnelt.

Meiner Meinung nach ist die eleganteste Lösung, eine Mindestlänge zu validieren, nichts weiter.

10
mindplay.dk

Hier ist ein wunderbares Muster, das am ehesten mit der Validierung übereinstimmt, die ich erreichen musste. Ich bin nicht der ursprüngliche Autor, aber ich denke, es lohnt sich, dies mitzuteilen, da ich fand, dass dieses Problem sehr komplex und ohne eine präzise oder allgemein nützliche Antwort ist.

Der folgende reguläre Ausdruck erfasst häufig verwendete Zahlen- und Zeichenkombinationen in einer Vielzahl globaler Telefonnummernformate:

/^\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

Ursprüngliche Quelle: --- (http://www.regexr.com/38pvb

9
Stuart Kershaw

Es wird Ihnen schwer fallen, mit einem einfachen Regex mit internationalen Nummern umzugehen, siehe dieser Beitrag zu den Schwierigkeiten internationaler (und sogar nordamerikanischer) Telefonnummern.

Sie sollten die ersten Ziffern analysieren, um die Landesvorwahl zu ermitteln, und dann je nach Land anders vorgehen.

Darüber hinaus - die Liste, die Sie angegeben haben, enthält kein anderes gängiges US-Format - wird die erste Nummer weggelassen. Die meisten Mobiltelefone in den USA benötigen diese Nummer nicht und es wird die jüngere Generation verblüffen, wenn sie nicht international gewählt haben.

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

-Adam

9
Adam Davis

Hier ist mein bisher bester Versuch. Es behandelt die oben genannten Formate, aber ich bin sicher, dass ich einige andere mögliche Formate vermisse.

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
8

Nachdem Sie diese Antworten gelesen haben, scheint es keinen einfachen regulären Ausdruck zu geben, der eine Reihe von Texten analysieren und Telefonnummern in einem beliebigen Format (einschließlich international mit und ohne Pluszeichen) auslesen kann.

Folgendes habe ich kürzlich für ein Kundenprojekt verwendet, bei dem wir alle Telefonnummern in einem beliebigen Format in tel: links konvertieren mussten.

Bisher hat es mit allem funktioniert, was sie darauf geworfen haben, aber wenn Fehler auftauchen, aktualisiere ich diese Antwort.

Regex:

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

PHP-Funktion zum Ersetzen aller Telefonnummern durch tel: links (falls 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;
}
8
Drew Thomas

Ich glaube, die Number :: Phone :: US und Regexp :: Common (insbesondere die Quelle von Regexp :: Common :: URI :: RFC2806 =) Perl-Module könnten helfen.

Die Frage sollte wahrscheinlich etwas genauer spezifiziert werden, um den Zweck der Validierung der Zahlen zu erläutern. Beispielsweise ist 911 in den USA eine gültige Zahl, aber 911x ist für keinen Wert von x gültig. Damit kann die Telefongesellschaft berechnen, wann Sie mit dem Wählen fertig sind. Es gibt verschiedene Variationen zu diesem Thema. Ihr regulärer Ausdruck überprüft jedoch nicht den Bereich der Vorwahl, sodass dies kein Problem zu sein scheint.

Wie bei der Überprüfung von E-Mail-Adressen können Sie auch bei einem gültigen Ergebnis erst dann feststellen, ob es jemandem zugewiesen wurde, wenn Sie es versuchen.

Wenn Sie versuchen, Benutzereingaben zu validieren, warum nicht das Ergebnis normalisieren und damit fertig werden? Wenn der Benutzer eine Nummer eingibt, die Sie nicht als gültige Nummer erkennen können, speichern Sie diese entweder als eingegeben oder streifen Sie nicht verfügbare Zeichen ab. Das Number :: Phone :: Normalize Perl-Modul könnte eine Quelle der Inspiration sein.

6
Jon Ericson

Ich arbeite für ein Marktforschungsunternehmen und wir müssen diese Art von Eingaben immer filtern. Sie erschweren es zu sehr. Entfernen Sie einfach die nicht-alphanumerischen Zeichen und prüfen Sie, ob eine Erweiterung vorhanden ist.

Für weitere Analysen können Sie einen von vielen Anbietern abonnieren, der Ihnen den Zugriff auf eine Datenbank mit gültigen Nummern ermöglicht und Ihnen mitteilt, ob es sich um Festnetz- oder Mobilfunkanschlüsse, getrennte Verbindungen usw. handelt. Dies kostet Geld.

4
Joe Phillips

Ersetzen Sie die Formatierungszeichen und überprüfen Sie die verbleibende Gültigkeit des Telefons. In PHP

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

Das Brechen eines komplexen regulären Ausdrucks wie dieses kann genauso effektiv, aber viel einfacher sein.

4
rooskie

Es ist wahrscheinlich besser, wenn Sie hierfür einen maskierten Eingang verwenden. Auf diese Weise können Benutzer NUR Zahlen eingeben und Sie können formatieren, wie Sie möchten. Ich bin nicht sicher, ob dies für eine Webanwendung ist, aber wenn dies der Fall ist, gibt es ein sehr schnelles jQuery-Plugin, das einige Optionen dafür bietet.

http://digitalbush.com/projects/masked-input-plugin/

In ihrem Tutorial wird sogar erläutert, wie Telefonnummerneingaben maskiert werden.

3
Abe Miessler

Ich hatte mit dem gleichen Problem zu kämpfen und versuchte, meine Anwendung zukunftssicher zu machen, aber diese Jungs haben mich dazu gebracht, in die richtige Richtung zu gehen. Ich überprüfe die Nummer selbst nicht, um festzustellen, ob sie funktioniert oder nicht. Ich versuche nur sicherzustellen, dass eine Reihe von Nummern eingegeben wurde, die möglicherweise eine Erweiterung haben oder nicht.

Im schlimmsten Fall müsste der Benutzer eine unformatierte Nummer aus der XML-Datei ziehen, und er würde die Nummern trotzdem einfach in das Nummernfeld des Telefons eingeben 012345678x5, kein wirklicher Grund, sie hübsch zu halten. Diese Art von RegEx würde für mich ungefähr so ​​aussehen:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890
3
Keith Wiggans

Hier ist eine, die in JavaScript gut funktioniert. Es ist eine Zeichenfolge, weil das Dojo-Widget dies erwartet hat.

Es entspricht einer 10-stelligen NANP-Nummer in Nordamerika mit optionaler Erweiterung. Leerzeichen, Bindestriche und Punkte werden als Trennzeichen akzeptiert.

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"
3
Richard Ayotte

Ich fand das interessant. Ich habe es nicht getestet, aber es sieht so aus, als würde es funktionieren

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>
3
Chris

Meine Neigung ist zuzustimmen, dass es am besten ist, Nicht-Ziffern zu entfernen und nur zu akzeptieren, was da ist. Vielleicht, um sicherzustellen, dass mindestens ein paar Ziffern vorhanden sind, obwohl dies beispielsweise eine alphabetische Telefonnummer "ASK-JAKE" verbietet.

Ein paar einfache Perl-Ausdrücke könnten sein:

@f = /(\d+)/g;
tr/0-9//dc;

Verwenden Sie die erste, um die Zifferngruppen zusammenzuhalten, was Hinweise auf die Formatierung geben kann. Verwenden Sie die zweite, um alle Nicht-Ziffern zu werfen.

Ist es bedenklich, dass eine Pause erforderlich ist und dann weitere Schlüssel eingegeben werden müssen? Oder so etwas wie 555-1212 (warte auf den Piepton) 123?

2
piCookie
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

Muss mit einer Ziffer enden, kann mit (oder + oder einer Ziffer beginnen und darf + - (oder) enthalten

2
Ian

Für alle, die etwas Ähnliches mit irischen Mobiltelefonnummern machen möchten, gibt es hier eine einfache Möglichkeit, dies zu erreichen:

http://ilovenicii.com/?p=87

PHP


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

Es gibt auch eine JQuery-Lösung für diesen Link.

BEARBEITEN:

jQuery-Lösung:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

Quelle .

2
Bob-ob

Da es für diesen Beitrag kein Sprach-Tag gibt, gebe ich eine regex -Lösung, die in Python verwendet wird.

Der Ausdruck selbst:

1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+

Bei Verwendung in Python:

import re

phonelist ="1-234-567-8901,1-234-567-8901 1234,1-234-567-8901 1234,1 (234) 567-8901,1.234.567.8901,1/234/567/8901,12345678901"

phonenumber = '\n'.join([phone for phone in re.findall(r'1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+' ,phonelist)])
print(phonenumber)

Ausgabe:

1-234-567-8901
1-234-567-8901 1234
1-234-567-8901 1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1
SIM

Ich würde nicht empfehlen, einen regulären Ausdruck dafür zu verwenden.

Entfernen Sie wie bei der oberen Antwort die gesamte Hässlichkeit von der Telefonnummer, sodass Sie eine Zeichenfolge mit numerischen Zeichen und einen 'x' erhalten, wenn Durchwahlen angegeben sind.

In Python:

Hinweis: BAD_AREA_CODES stammt aus einer Textdatei , die Sie im Web abrufen können.

BAD_AREA_CODES = open('badareacodes.txt', 'r').read().split('\n')

def is_valid_phone(phone_number, country_code='US'):
    """for now, only US codes are handled"""
    if country_code:
        country_code = country_code.upper()

    #drop everything except 0-9 and 'x'
    phone_number = filter(lambda n: n.isdigit() or n == 'x', phone_number)

    ext = None
    check_ext = phone_number.split('x')
    if len(check_ext) > 1:
        #there's an extension. Check for errors.
        if len(check_ext) > 2:
            return False
        phone_number, ext = check_ext

    #we only accept 10 digit phone numbers.
    if len(phone_number) == 11 and phone_number[0] == '1':
        #international code
        phone_number = phone_number[1:]
    if len(phone_number) != 10:
        return False

    #area_code: XXXxxxxxxx 
    #head:      xxxXXXxxxx
    #tail:      xxxxxxXXXX
    area_code = phone_number[ :3]
    head      = phone_number[3:6]
    tail      = phone_number[6: ]

    if area_code in BAD_AREA_CODES:
        return False
    if head[0] == '1':
        return False
    if head[1:] == '11':
        return False

    #any other ideas?
    return True

Das deckt einiges ab. Es ist kein regulärer Ausdruck, aber es kann ziemlich leicht auf andere Sprachen abgebildet werden.

1
Droogans

Ist es möglich, die 4 separaten Felder (Vorwahl, dreistelliges Präfix, vierstelliger Teil, Erweiterung) für die Anzeige zu haben, damit sie jeden Teil der Adresse separat eingeben können und Sie jedes Stück einzeln überprüfen können? Auf diese Weise können Sie nicht nur die Überprüfung erheblich vereinfachen, sondern auch Ihre Telefonnummern in einem einheitlicheren Format in der Datenbank speichern.

1
Kibbee

Finde String regex = "^\\+(?:[0-9] ?){6,14}[0-9]$";

hilfreich für internationale Nummern.

1
Sai prateek

Es ist nahezu unmöglich, alle Arten von internationalen Telefonnummern mit einfachem Regex zu verarbeiten.

Sie sollten einen Dienst wie numverify.com verwenden, der eine kostenlose JSON-API für internationale Telefone anbietet Bei jeder Anfrage erhalten Sie nützliche Informationen zu Land, Standort, Netzbetreiber und Leitungstyp.

1
Frank

Arbeitsbeispiel für die Türkei, ändern Sie einfach die

d{9}

nach Ihren Bedürfnissen und beginnen Sie es zu verwenden.

function validateMobile($phone)
{
    $pattern = "/^(05)\d{9}$/";
    if (!preg_match($pattern, $phone))
    {
        return false;
    }
    return true;
}

$phone = "0532486061";

if(!validateMobile($phone))
{
    echo 'Incorrect Mobile Number!';
}

$phone = "05324860614";
if(validateMobile($phone))
{
    echo 'Correct Mobile Number!';
}
1
Sinan Eldem

Versuchen Sie dies (es ist für die Validierung der indischen Handynummer):

if (!phoneNumber.matches("^[6-9]\\d{9}$")) {
  return false;
} else {
  return true;
}
0
Shylendra Madda

Hinweis Es wird eine US-Mobiltelefonnummer in einem beliebigen Format als Eingabe verwendet und optional ein zweiter Parameter akzeptiert - true, wenn die formatierte Ausgabe-Mobiltelefonnummer hübsch aussehen soll. Wenn es sich bei der angegebenen Nummer nicht um eine Mobiltelefonnummer handelt, wird einfach false zurückgegeben. Wenn eine Mobiltelefonnummer IS erkannt wird, wird die gesamte bereinigte Nummer anstelle von true zurückgegeben.

    function isValidMobile(num,format) {
        if (!format) format=false
        var m1 = /^(\W|^)[(]{0,1}\d{3}[)]{0,1}[.]{0,1}[\s-]{0,1}\d{3}[\s-]{0,1}[\s.]{0,1}\d{4}(\W|$)/
        if(!m1.test(num)) {
           return false
        }
        num = num.replace(/ /g,'').replace(/\./g,'').replace(/-/g,'').replace(/\(/g,'').replace(/\)/g,'').replace(/\[/g,'').replace(/\]/g,'').replace(/\+/g,'').replace(/\~/g,'').replace(/\{/g,'').replace(/\*/g,'').replace(/\}/g,'')
        if ((num.length < 10) || (num.length > 11) || (num.substring(0,1)=='0') || (num.substring(1,1)=='0') || ((num.length==10)&&(num.substring(0,1)=='1'))||((num.length==11)&&(num.substring(0,1)!='1'))) return false;
        num = (num.length == 11) ? num : ('1' + num);   
        if ((num.length == 11) && (num.substring(0,1) == "1")) {
            if (format===true) {
               return '(' + num.substr(1,3) + ') ' + num.substr(4,3) + '-' + num.substr(7,4)
            } else {
               return num
            }
        } else {
            return false;
        }
    }
0
Gautam Sharma