So validieren Sie Telefonnummern mit Regex

920

Ich versuche, einen umfassenden regulären Ausdruck zusammenzustellen, um Telefonnummern zu validieren. Im Idealfall werden internationale Formate verarbeitet, es müssen jedoch US-Formate verarbeitet 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.

Nicholas Trandem
quelle
3
Übrigens sollten Sie angeben, welche Sprache Sie verwenden. Nicht alle Regex-Engines haben dieselbe Syntax.
AndrewJFord
9
Scheint, als hätten Sie die Option +1 anstelle von nur 1 weggelassen, obwohl die Antwort diesen Fall abdeckt.
Eric
153
Erfordern nicht alle US-Telefonnummern 555außer ihnen 911?
Andrew Grimm
41
Im Gegenteil, das Präfix 555 ist für gefälschte Telefonnummern reserviert. Diese Nummern stellen garantiert keine Verbindung zu einer tatsächlichen Telefonnummer her, sodass sie häufig in Fernsehen und Filmen verwendet werden, um sicherzustellen, dass ein Zuschauer nicht versucht, die Nummer anzurufen, und am Ende einige arme Unschuldige belästigt.
Rushinge
49
@rushinge Während das vor Jahrzehnten wahr war, ist es nicht mehr wahr . Das Präfix 555 ist immer noch etwas Besonderes, aber es wird garantiert, dass nur ein kleiner Bereich von Nummern ohne Verbindung 555-0100 bis 555-0199 endet. Aber ich bin mir ziemlich sicher, dass Andrew trotzdem Spaß gemacht hat.
Adam Davis

Antworten:

515

Bessere Option ... entfernen Sie einfach alle nichtstelligen Zeichen bei der Eingabe (mit Ausnahme von 'x' und führenden '+'), und achten Sie dabei auf die britische Tendenz, Zahlen in nicht standardmäßiger Form zu schreiben, +44 (0) ...wenn Sie aufgefordert werden, das internationale Präfix zu verwenden (In diesem speziellen Fall sollten Sie das (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
scunliffe
quelle
35
Der Formatierungscode wird Zeitverschwendung sein, wenn die Nummern von außerhalb der USA stammen dürfen.
Daniel Earwicker
26
Das ist gut und alles, aber es bestätigt nicht, dass die eingegebene Nummer tatsächlich eine Telefonnummer war. Was ist zum Beispiel, wenn der Benutzer die erforderlichen 10 Ziffern nicht eingibt? Dies sollte mit einer guten Regex-Validierung kombiniert werden.
Hugh Jeffner
108
In Anbetracht der Frage ging es um Validierung - dies ist eine wirklich sehr, sehr schlechte Antwort.
PlexQ
15
@PlexQ Ich bin anderer Meinung. Das ursprüngliche Problem besteht darin, die Überprüfung der Telefonnummer durchzuführen, da versucht wurde, alle möglichen Formatierungsoptionen zu verarbeiten. Anstatt zu versuchen, all das zu lösen, nehmen Sie die Eingabe und "entfernen" Sie alle Formatierungsflusen, bis Sie nur noch die "Nummer" haben. Auf diese Weise werden zwei Probleme gelöst: Das Testen des Ergebnisses ist jetzt einfach und Sie können jetzt sicherstellen, dass alle für die Anzeige wiedergegebenen Werte konsistent formatiert werden können. Der erste Kommentar zu dieser Antwort über die "Complicator's Gloves" ist eine gute Lektüre ... manchmal besteht die Antwort auf ein Problem darin, es anders anzugehen.
Scunliffe
29
Wie zum Teufel ist das eine so hochgewählte Antwort? Dies bestätigt nichts. Was noch schlimmer ist, ist, dass alle anderen Fragen zur Validierung der Telefonnummer auf diese verweisen ...
jlars62
303

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

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

Hier ist ein regulärer Ausdruck für eine 7- oder 10-stellige Zahl mit zulässigen 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+))?$
fatcat1111
quelle
7
hier ist es ohne den Erweiterungsabschnitt (ich lasse meine Benutzer ext in ein separates Feld eingeben): ^ (?: (?: \ +? 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}) $
aarona
18
Hier ist eine Version, die nur 10-stelligen Telefonnummern entspricht (nicht 7-stelligen wie 843-1212): /(?:(?:\+?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})/
Brian Armstrong
8
10-stellig akzeptiert () um die Vorwahl und erlaubt es nicht, 1 als Landesvorwahl vorzugehen(?:(?:(\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})
Brooke.
5
@StevenSoroka Ich habe Jeffrey Friedls Buch seit zwei Jahren neben mir auf meinem Schreibtisch, da reguläre Ausdrücke einen großen Teil meiner Arbeit ausmachen. Es dauert eine Weile, um reguläre Ausdrücke wirklich zu verstehen. Manchmal suchen die Leser dieser Website einfach nach einer vorhandenen Lösung, anstatt eine eigene zu schreiben, insbesondere in Domänen mit vielen Eckfällen, wie z. B. der Darstellung von Telefonnummern.
Justin R.
7
@ fatcat1111 Ich verstehe das, aber die meisten Antworten hier sind einmalige reguläre Ausdrücke vom Typ "Ich auch", die wahrscheinlich nicht in einen Ihrer Eckfälle passen. Diese landen dann auf allen Websites, die ich verwenden möchte, und ich kann meine Postleitzahl, Telefonnummer oder E-Mail-Adresse nicht eingeben, da jemand einen halbherzigen regulären Ausdruck verwendet hat (z. B.: + Ist ein gültiges Zeichen in E-Mail-Adressen ). Die besten Antworten auf dieser Seite verweisen Benutzer auf Bibliotheken und nicht auf von Servietten gekritzelte Regexe.
Steven Soroka
298
.*

Wenn die Benutzer Ihnen ihre Telefonnummern geben möchten, vertrauen Sie darauf, dass sie es richtig machen. Wenn sie es Ihnen nicht geben möchten, werden sie durch die Eingabe einer gültigen Nummer entweder an die Website eines Mitbewerbers gesendet oder eine zufällige Zeichenfolge eingegeben, die zu Ihrer Regex passt. Ich könnte sogar versucht sein, die Nummer einer Premium-Horoskop-Hotline nachzuschlagen und diese stattdessen einzugeben.

Ich würde auch einen der folgenden Einträge als gültige Einträge 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"
Dave Kirby
quelle
202
Ich stimme dem Gefühl hier zu, aber manchmal ist es schön, eine Validierung durchzuführen, wenn die Telefonnummer tatsächlich für etwas verwendet wird, das im Interesse des Benutzers wichtig ist . Das beste Beispiel hierfür ist die Kreditkartenautorisierung für einen Kauf. Wenn die Telefonnummer falsch ist, schlägt die Authentifizierung möglicherweise fehl.
Pointy
53
Wenn der Benutzer seine Telefonnummer nicht eingeben möchte, können Sie einfach zulassen, dass das Feld optional ist. Ist es jedoch zu viel, den Benutzer zu bitten, eine gültige Telefonnummer einzugeben, wenn er eine eingeben möchte?
Joel McBeth
11
Eine Rolle der Validierung besteht auch darin, die Leute einfach daran zu erinnern, Ortsvorwahlen usw. hinzuzufügen, an die sie sich sonst möglicherweise nicht erinnern, aber die möglicherweise nicht nachträglich erraten werden können.
Ben McIntyre
29
@Pointy Aber die Regex-Validierung hilft Ihnen nicht weiter. Die einzige Möglichkeit, tatsächlich zu überprüfen, ob die Telefonnummer korrekt ist, besteht darin, eine Nachricht an diese zu senden (im Falle eines Mobiltelefons) UND sicherzustellen, dass der Benutzer dies mithilfe eines Bestätigungscodes bestätigt. Dies tun Sie, wenn die Richtigkeit der Zahlen wichtig ist. Alles andere dient nur der Bequemlichkeit des Benutzers, um sich vor einigen (aber nicht allen) Tippfehlern zu schützen, und validiert nichts.
Alex B
14
Cool. Meine Telefonnummer ist 1 'ODER 1 = 1 - PWNED . Siehe xkcd.com/327 und owasp.org/index.php/Testing_for_SQL_Injection_(OWASP-DV-005)
Aaron Newton
171

Ich würde auch vorschlagen, die Google-Bibliothek " libphonenumber " zu besuchen . Ich weiß, es ist kein Regex, aber es macht genau das, was Sie wollen.

Zum Beispiel wird es erkennen, 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- erhält den Typ der Nummer basierend auf der Nummer selbst; Festnetz-, Mobil-, gebührenfreie, Premium-Tarif-, Shared Cost-, VoIP- und persönliche Nummern (wann immer möglich) können unterschieden werden.
  • isNumberMatch - erhält ein Konfidenzniveau, ob zwei Zahlen gleich sein könnten.
  • getExampleNumber/ getExampleNumberByType- bietet gültige Beispielnummern für alle Länder / Regionen mit der Option, anzugeben, welche Art von Beispieltelefonnummer benötigt wird.
  • isPossibleNumber - schnell 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 anhand von Längen- und Präfixinformationen.
  • AsYouTypeFormatter - Formatiert Telefonnummern im laufenden Betrieb, wenn Benutzer jede Ziffer 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, dass sie sehr kulturell abhängig sind.

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

Ein regulärer Ausdruck ist in Ordnung, um das Format einer Telefonnummer zu überprüfen, aber er kann die Gültigkeit einer Telefonnummer nicht wirklich ü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) .

Libphonenumber vorstellen!

Anhand eines Ihrer komplexeren Beispiele erhalten 1-234-567-8901 x1234Sie 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

Sie erfahren also nicht nur, ob die Telefonnummer gültig ist (was sie ist), sondern Sie erhalten auch eine konsistente Telefonnummernformatierung in Ihrem Gebietsschema.

Als Bonus libphonenumbergibt es eine Reihe von Datensätzen, mit denen auch die Gültigkeit von Telefonnummern überprüft werden kann. Wenn Sie also eine Nummer wie +61299999999(die internationale Version von (02) 9999 9999) überprüfen, wird diese als gültige Nummer mit Formatierung zurückgegeben:

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 Abrufen des Standorts, 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

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

Sofern Sie nicht sicher sind, dass Sie immer 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 zum Überprüfen und Anzeigen von Telefonnummern zu verwenden.

Tim Groeneveld
quelle
Unter Hinweis darauf, dass es jetzt auch einen Go-Port gibt unter: github.com/ttacon/libphonenumber
michaelhanson
Müssen Sie bei der Überprüfung, ob es sich um eine mögliche Nummer handelt, keinen Ländercode angeben? Ich verwende die PHP-Version und wenn ich eine britische Zahl wie (ersetze Nullen durch reelle Zahlen) 07700000000eingebe, wird eine Missing or invalid default region.Fehlermeldung angezeigt. Aber wenn ich den Ländercode spezifiziere, wird er übergeben.
BugHunterUK
Zu
Ihrer Information
1
@BugHunterUK (und jeder, der auf diese Frage stößt und sich das gleiche fragt) kann beim Parsen einer Nummer die erwartete Region angeben, und die Bibliothek sucht nach nicht internationalen Nummern in dieser Region. Wenn Sie nichts angeben, wird alles abgelehnt, was nicht in einem gültigen internationalen Format vorliegt.
IMSoP
Betrachten Sie github.com/nyaruka/phonenumbers als das von Google empfohlene "offizielle" Go-Paket anstelle von libphonenumber.
DeeZone
78

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

Dies passt zu:

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

Ismael Miguel
quelle
Dies war der umfassendste reguläre Ausdruck, den ich je gesehen habe. Es ist leicht zu umgehen , bis Sie entfernen ^und $sonst zu umgehen , ich bin in der Lage es mit [111] [111] [1111]oder 111--111--1111und dergleichen. (Entschuldigung, habe meinen letzten Kommentar gelöscht)
bafromca
Können Sie bitte umformulieren? Ich kann das nicht verstehen: "Es ist einfach, sich zurechtzufinden, bis Sie ^ und $ entfernen, oder ich kann es mit [111] [111] [1111] umgehen". Bedeutet das, dass es '[111] [111] [1111]' validiert, wenn Sie das ^und das nehmen $?
Ismael Miguel
Ich habe deine Regex mit [111] [111] [1111]und 111--111--1111bis ich sie entfernt ^und $aus der Regex entfernt habe umgangen.
bafromca
11
^^^ Dies ist ein großartiges Beispiel dafür, warum Kommentarthreads NICHT zum Chat gehen sollten. Ich bin sehr daran interessiert, wie sich dieses Gespräch entwickelt hat, und muss wissen, ob dieses ReGex robust genug ist, um es in meiner App zu verwenden. Leider ist das Chat-Gespräch jetzt weg.
Matt Cashatt
1
Um ehrlich zu sein, bin ich nicht zum Plaudern gegangen. Nachdem ich mehrmals nach Erklärungen gefragt hatte, blieb mir keine Information. Sie können es jederzeit selbst mit allen Arten von Zahlen versuchen, die Sie online in verschiedenen Formaten finden. Eine Sache, die ich mit diesem versucht habe, ist, mehrere Telefonnummern zu verwenden, aber es funktioniert nicht so gut, wenn sie Leerzeichen haben. Und ich muss eine Lösung finden, um die Anzahl der Ziffern zu zählen und eine bestimmte Anzahl durchzusetzen.
Ismael Miguel
63

Obwohl die Antwort zum Entfernen aller Leerzeichen ordentlich ist, löst sie das Problem, das darin besteht, einen regulären Ausdruck zu finden, nicht wirklich. Nehmen Sie zum Beispiel mein Testskript, das eine Webseite herunterlädt und alle Telefonnummern mit dem regulären Ausdruck extrahiert. Da Sie sowieso eine Regex benötigen, können Sie die Regex genauso gut die ganze Arbeit erledigen lassen. Ich habe mir das 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 zum Testen. Wenn Sie übereinstimmen, enthält $ 1 die Vorwahl, $ 2 und $ 3 die Telefonnummer und $ 5 die Nebenstelle. Mein Testskript lädt eine Datei aus dem Internet herunter und druckt 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";
        }
}

Bearbeiten:

Sie können \ W * im regulären Ausdruck in \ s * \ W? \ S * ändern, um es etwas zu straffen. Ich habe nicht an den regulären Ausdruck gedacht, um beispielsweise Benutzereingaben in einem Formular zu validieren, als ich ihn geschrieben habe, 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*))?';
indiv
quelle
2
Zu Ihrer Information, der reguläre Ausdruck stimmt auch überein: Dies (4570457-6789wäre ein ziemlich häufiger Tippfehler. Die Spielgruppen werden auch verzerrt: rubular.com/r/TaTP0mHL5c
SooDesuNe
@SooDesuNe Prepending (^|[^\d\n])(mit aktiviertem mehrzeiligen Flag) vermeidet das allgemeine Problem, indem sichergestellt wird, dass nicht unmittelbar etwas Numerisches vorangestellt wird.
Btown
Beachten Sie, dass dies auf Nordamerika ausgerichtet ist - es fehlt "44 7911 123456"
Ben Wheeler
43

Ich beantwortete diese Frage bei einer anderen SO-Frage, bevor ich mich entschied, meine Antwort auch als Antwort in diesen Thread aufzunehmen, da sich niemand damit befasste, wie Elemente erforderlich / nicht erforderlich sind, sondern nur Regexs verteilten: Regex funktioniert falsch und passt zu unerwarteten Dingen

Aus meinem Beitrag auf dieser Website habe ich eine Kurzanleitung erstellt, die jedem hilft, einen eigenen regulären Ausdruck für das gewünschte Telefonnummernformat zu erstellen. Ich werde (wie auf der anderen Website) darauf hinweisen, dass Sie, wenn Sie zu restriktiv sind, Möglicherweise erhalten Sie nicht die gewünschten Ergebnisse, und es gibt keine "Einheitslö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 [)]. Verwenden \(und \)ist hässlich und kann die Dinge verwirren.
  • Wenn Sie möchten, dass etwas optional ist, setzen Sie ein ?nach
  • Wenn Sie einen Bindestrich wünschen, geben Sie einfach -oder ein [-]. Wenn Sie es jedoch nicht an erster oder letzter Stelle in einer Reihe anderer Zeichen setzen, müssen Sie es möglicherweise umgehen: \-
  • Wenn Sie verschiedene Auswahlmöglichkeiten in einem Steckplatz akzeptieren möchten, setzen Sie Klammern um die Optionen: [-.\s]Benötigt einen Bindestrich, einen Punkt oder ein Leerzeichen. Ein Fragezeichen nach der letzten Klammer macht alle für diesen Steckplatz optional.
  • \d{3}: Erfordert eine dreistellige Nummer: 000-999. Abkürzung für [0-9][0-9][0-9].
  • [2-9] : Benötigt eine Ziffer 2-9 für diesen Steckplatz.
  • (\+|1\s)? : Akzeptiere ein "Plus" oder eine 1 und ein Leerzeichen (Pipe-Zeichen, | , ist "oder") und machen Sie es optional. Das Pluszeichen muss maskiert werden.
  • Wenn Sie möchten, dass bestimmte Zahlen mit einem Steckplatz übereinstimmen, geben Sie sie ein: Benötigt [246]eine 2, 4 oder 6. [77|78]Benötigt 77 oder 78.
  • $/ : Beende den Ausdruck
vapcguy
quelle
1
Dies ist sehr nützlich, aber ich bezweifle und suche nach einem {min, max} Ausdruck. Kannst du helfen?
Ataboy Josef
Wenn es sich um eine einzelne Ziffer handelt (und Sie können sie entsprechend anpassen), lesen Sie den [2-9]Block, den ich dort eingefügt habe. Das bedeutet, dass Ihr Minimum 2 und Ihr Maximum 9 beträgt. Passen Sie es entsprechend an.
Vapcguy
30

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

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

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

Artjom Kurapov
quelle
38
Dies validiert Tonnen von Zahlen, die technisch ungültig sind. wie "- + () () ()) ()))". Lernen Sie, reguläre Ausdrücke zu lesen, damit Sie verstehen, was Sie tun.
Steven Soroka
3
@StevenSoroka technisch kann es viele ungültige Fälle zulassen, aber wenn wir darüber nachdenken, dem Benutzer nur zu helfen, häufige Fehler mit der einfachsten möglichen Lösung zu vermeiden, ist dies der
richtige
2
dies auch passenden Leerraum, leere Zeile
Wasim A.
1
@ HappyHardik. Tatsächlich. Einfach und leistungsstark. Für die grundlegende Validierung kann der Benutzer mehr als einen Punkt, einen Bindestrich, eine Klammer oder ein Plus eingeben.
Dijipiji
Ich habe es gerade benutzt und es ist in vielen Aspekten falsch. Beispielsweise kann eine britische Telefonnummer mit +44 beginnen, oder eine Telefonnummer enthält (0). Dies gilt jedoch nicht gemäß Ihrem regulären Ausdruck. Ich würde die Antwort von @Ismael Miguel empfehlen. Es funktioniert gut und ich würde Ihnen empfehlen, Ihre Antwort zu überarbeiten.
Stelios Voskos
22

Wenn Sie nur überprüfen möchten, ob Sie keinen zufälligen Müll auf dem Feld haben (dh von Formular-Spammern), sollte dieser reguläre Ausdruck gut funktionieren:

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

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

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

Wenn Sie Regeln pro Ziffer beibehalten möchten (z. B. in US-Vorwahlen und Präfixen (Umtauschcodes), die im Bereich von 200 bis 999 liegen müssen), wünschen wir Ihnen viel Glück. Die Aufrechterhaltung eines komplexen Regelsatzes, der zu irgendeinem Zeitpunkt in der Zukunft von jedem Land der Welt veraltet sein könnte, klingt nicht nach Spaß.

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 Validierung nicht verwerfen, insbesondere wenn Sie dies wünschen Nehmen Sie Korrekturen in einem anderen Feld vor.

Steve
quelle
22

Beachten Sie, dass das Entfernen von ()Zeichen für einen gängigen Schreibstil für UK-Nummern nicht funktioniert: +44 (0) 1234 567890Dies bedeutet, dass Sie entweder die internationale Nummer
+441234567890
oder die UK- Nummer wählen01234567890

Ben Clifford
quelle
15

Haben Sie sich RegExLib angesehen? ?

Die Eingabe der US-Telefonnummer brachte eine ganze Reihe von Möglichkeiten zurück.

Rob Wells
quelle
3
Dies scheint eine großartige Möglichkeit zu sein, obskure Fehler in Ihren Code zu integrieren.
Tom Lord
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

Es liegt an Ihnen, es für die Anzeige zu bereinigen. Nach der Validierung kann es sich jedoch um eine Zahl handeln.

ReactiveRaven
quelle
12

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, um dies sicherzustellen.

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

Herobrine2Nether
quelle
11

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 nicht intern konsistent ist - zum Beispiel mit einem gültigen Satz von Nummern, aber ohne zu bestätigen, dass die Amtsleitung, der Austausch usw. mit dem gültigen Muster für das Ländercode-Präfix übereinstimmen .

Nordamerika ist unkompliziert, und für internationale Unternehmen bevorzuge ich ein "idiomatisches" Muster, das die Art und Weise abdeckt, wie Menschen ihre Zahlen spezifizieren und sich daran erinnern:

^((((\(\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 beide enthalten sind, wenn eine Klammer enthalten ist. Die internationalen Konten enthalten ein optionales Anfangsbuchstaben '+' und einen Ländercode. Danach sind Sie in der Sprache. 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.

ron0
quelle
Ich habe versucht, das oben Genannte in mein Javascript-Validierungsskript zu implementieren, erhalte jedoch weiterhin eine invalid quantifierFehlermeldung. Irgendwelche Ideen, was ich falsch mache?
Jannis
Ich würde den trivialen Fall hinzufügen, in dem das Telefon ohne Symbole angegeben ist, aber möglicherweise Leerzeichen und Ländercode. In Europa ist dies typisch für lokale und Mobiltelefonnummern: 676412342, 676 46 32 12, 676 463 212
rupps
11

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 zu teilen, da ich dieses Problem als sehr komplex und ohne eine präzise oder allgemein nützliche Antwort empfand.

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

Stuart Kershaw
quelle
Dies hat einige eingeschränkte Unterstützung für Erweiterungen. Es entspricht "616-555-1234 x567", jedoch nicht "616-555-1234 ext. 567".
Jon Schneider
2
Falsch positiv für zB "------- ((((((55555555") "oder" 999999999999999999999999999 "))
Mikep
Es bestätigt nicht Nitherland Macdonalds Nummer +31 76 596 4192 (Ich habe nur auf Zufallszahlen getestet)
BIOHAZARD
10

Mein Bauchgefühl wird durch die Anzahl der Antworten auf dieses Thema verstärkt - dass es praktisch unendlich viele Lösungen für dieses Problem gibt, 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 Validator schreiben könnten, der all die verschiedenen legitimen Formate zulässt, würde er am Ende so ziemlich alles zulassen, was überhaupt einer Telefonnummer ähnelt.

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

mindplay.dk
quelle
Nachdem ich einige davon ausprobiert und die vorhandenen Daten und Rückmeldungen von Benutzern durchgesehen habe, stimme ich eher zu ...
Christopher King
Manchmal müssen Sie jedoch eine Validierung durchführen. Wenn ich Bestätigungscodes versende, kann ich nicht einfach einen Code an einen zufälligen Müll senden, den ein Spammer in das Feld eingegeben hat. Ich möchte sicherstellen, dass es sich bei der Nummer wahrscheinlich um eine Telefonnummer handelt, bevor ich Ressourcen für die Nachrichtenübermittlung verschwende.
Luke
10

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

((\+[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}

wird diesen entsprechen:

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

Der erste entspricht JEDEM zweistelligen Ländercode, während der zweite ausschließlich dem philippinischen Ländercode entspricht.

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

GaiusSensei
quelle
Vielen Dank. Wie wäre es mit Festnetznummern mit Vorwahl wie 028231234? Ich frage mich, ob Vorwahlen nur 2-3-stellige Zahlen sind und ihnen immer 0 vorangestellt ist.
Stormwild
9

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

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

Es wird Ihnen schwer fallen, mit internationalen Nummern mit einem einzigen / einfachen regulären Ausdruck umzugehen. Lesen Sie diesen Beitrag über die Schwierigkeiten internationaler (und sogar nordamerikanischer) Telefonnummern.

Sie sollten die ersten Ziffern analysieren, um festzustellen, wie der Ländercode lautet, und dann je nach Land unterschiedlich handeln.

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

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

-Adam

Adam Davis
quelle
Keine angebotene Lösung. ES IST MÖGLICH. Nur weil es schwierig oder komplex ist, heißt das nicht, dass Sie einfach Ihre Arme hochwerfen sollten.
Eric Hodonsky
7

Nach dem Lesen dieser Antworten 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) herausziehen 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 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 (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;
}
Drew Thomas
quelle
Dieser reguläre Ausdruck stimmte überein +1 1234562222222222222222222222.
Varda Elentári
warum nicht einfach zurückkehren?
Thexande
Falsch positiv für "99999999999999999999999999999999999999999"
Ben Wheeler
6

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

Die Frage sollte wahrscheinlich etwas genauer spezifiziert werden, um den Zweck der Validierung der Zahlen zu erläutern. Zum Beispiel ist 911 eine gültige Zahl in den USA, aber 911x ist nicht für einen Wert von x. Auf diese Weise 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 Teil der Vorwahl, sodass dies kein Problem zu sein scheint.

Wie bei der Überprüfung von E-Mail-Adressen können Sie auch dann, wenn Sie ein gültiges Ergebnis haben, nicht wissen, ob es jemandem zugewiesen wurde, bis Sie es versuchen.

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

Jon Ericson
quelle
Ich werde hier auf die Nerven gehen und sagen, dass es wahrscheinlich in fast allen Anwendungen dieser Regex eine schlechte Idee ist, 911 als Telefonnummer zuzulassen. Guter Fang.
Nicholas Flynt
4

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

Für weitere Analysen können Sie einen von vielen Anbietern abonnieren, die Ihnen Zugriff auf eine Datenbank mit gültigen Nummern gewähren und Ihnen mitteilen, ob es sich um Festnetz- oder Mobiltelefone handelt, die nicht verbunden sind usw. Dies kostet Geld.

Joe Phillips
quelle
Validierung? 123% $) *% () $ * () # 456 * () * $ # (* (# $ @ 8908 würde Ihrer vorgeschlagenen Lösung entsprechen.
PlexQ
1
@PlexQ 555-123-1234, 07777777777, 90210, 01/01/1901 - Benutzer sind erfinderisch darin, Müll durch Validierung zu rammen. Es ist besser, diejenigen, die wirklich seltsame Daten haben, nicht abzuwehren, indem Sie eine zu restriktive Validierung verwenden und ihnen mitteilen, dass sie falsch liegen.
ReactiveRaven
4

Ersetzen Sie das Formatieren von Zeichen 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 solchen komplexen regulären Ausdrucks kann genauso effektiv sein, aber viel einfacher.

Rooskie
quelle
3

Ich fand das etwas interessantes. 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.';
}
?>
Chris
quelle
4
Ihre Nachricht scheint darauf hinzudeuten, dass Sie diesen Code nicht geschrieben haben. Würde es Ihnen etwas ausmachen, eine Quelle zu zitieren?
Alastair Irvine
3

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

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

In ihrem Tutorial wird sogar erläutert, wie Telefonnummern eingegeben werden.

Abe Miessler
quelle
3

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

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

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

Ich hatte mit dem gleichen Problem zu kämpfen und versuchte, meine Bewerbung zukunftssicher zu machen, aber diese Leute haben mich in die richtige Richtung gebracht. 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 Nebenstelle haben oder nicht.

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

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

Meine Neigung ist es zuzustimmen, dass das Entfernen von nicht-Ziffern und das Akzeptieren dessen, was da ist, am besten 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 möglicherweise Hinweise zur Formatierung gibt. Verwenden Sie die zweite, um alle Nicht-Ziffern trivial zu werfen.

Ist es besorgniserregend, dass möglicherweise eine Pause eingelegt und dann weitere Tasten eingegeben werden müssen? Oder so etwas wie 555-1212 (auf den Piepton warten) 123?

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

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

Ian
quelle
2

Für alle, die daran interessiert sind, etwas Ähnliches mit irischen Mobiltelefonnummern zu tun, gibt es 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._-]+@[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 .

Lajos Arpad
quelle