Frage

Ich versuche, zusammen, um eine umfassende regex zu stellen Telefonnummern zu bestätigen. Im Idealfall wäre es internationale Formate handhaben, aber es muss US-Formate verarbeiten, 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 beantworten, aber ich bin der Hoffnung, jemand hat etwas besser und / oder eleganter.

War es hilfreich?

Lösung

bessere Option ... Streifen nur alle Nicht-stellige Zeichen auf Eingang (mit Ausnahme von ‚x‘ und führenden ‚+‘ Zeichen), weil die britischen Tendenz zu schreiben Zahlen in der Nicht-Standard-Form +44 (0) ... kümmert, wenn gefragt verwenden Sie die internationale Vorwahl (in diesem speziellen Fall, sollten Sie die (0) ganz verwerfen).

Dann beenden Sie mit Werten von bis wie:

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

Wenn Sie dann zu Ihrem Herzinhalt angezeigt werden, formatieren. z.

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

Andere Tipps

Es stellt sich heraus, dass es so etwas wie eine Spezifikation für diese ist, zumindest für Nordamerika, die so genannten NANP .

Sie müssen genau angeben, was Sie wollen. Was sind rechtliche Trennzeichen? Leerzeichen, Bindestriche und Punkte? Kein Begrenzer erlaubt? Kann man Trennzeichen (beispielsweise + ,111-222,3333) mischen? Wie werden die Erweiterungen (beispielsweise 111-222-3333 x 44444) gehen behandelt werden? Was über Sondernummern wie 911? Ist der Vorwahl geht optional oder erforderlich sein?

Hier ist ein regulärer Ausdruck für eine 7 oder 10-stellige Nummer, mit Erweiterungen erlaubt, Trennzeichen sind Leerzeichen, Bindestriche oder Perioden:

^(?:(?:\+?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+))?$
.*

Wenn der Benutzer möchte, dass Sie seine Telefonnummer geben, dann vertrauen ihm, es richtig zu machen. Wenn er es nicht Sie dann geben will ihn zwingen, eine gültige Nummer eingeben entweder ihn zu einem Mitbewerber-Website schicken oder ihm eine zufällige Zeichenfolge macht eingeben, die Ihre Regex paßt. Ich könnte sogar versucht sein, die Anzahl der Premium-Rate Sex Linie zu sehen und geben Sie, dass statt.

Ich würde auch eine der folgenden als gültigen 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"

Ich würde vorschlagen, auch bei der " libphonenumber " suche Google-Bibliothek. Ich weiß es nicht regex ist, aber es ist genau das, was Sie wollen.

Zum Beispiel, es wird erkennen, dass:

15555555555

ist eine möglichst große Zahl, aber keine gültige Zahl. Es unterstützt auch Länder außerhalb der USA.

Highlights der Funktionalität:

  • Parsing / Formatierung / Validierung von Telefonnummern für alle Länder / Regionen der Welt.
  • getNumberType - wird die Art der Zahl auf der Grundlage der Zahl selbst; Lage Festnetz, Mobile, gebührenfrei, Premium Rate, Shared Cost, VoIP und persönliche Nummern (wann immer möglich) zu unterscheiden.
  • isNumberMatch - bekommt einen Konfidenzniveau, ob zwei Zahlen gleich sein könnten
  • .
  • getExampleNumber / getExampleNumberByType -. Bietet gültige Beispiel Zahlen für alle Länder / Regionen, mit der Möglichkeit, anzugeben, welche Art von Beispiel Telefonnummer ist erforderlich
  • isPossibleNumber -. Schnell zu erraten, ob eine Zahl eine mögliche Telefonnummer ist nur unter Verwendung der Längeninformation, viel schneller als eine vollständige Validierung
  • isValidNumber - vollständige Validierung einer Telefonnummer für einen Bereich mit Länge und Präfixinformationen
  • .
  • AsYouTypeFormatter -. Formate Telefonnummern on-the-fly, wenn Benutzer jede Ziffer eingeben
  • findNumbers - findet Zahlen in Texteingabe
  • .
  • PhoneNumberOfflineGeocoder - bietet geografische Informationen zu einer Telefonnummer zusammen.

Beispiele

Das größte Problem mit Telefonnummer Validierung ist es sehr kulturell abhängig.

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

Ein regulärer Ausdruck ist in Ordnung, das Format einer Telefonnummer zur Überprüfung, aber es ist nicht wirklich die Gültigkeit von einer Telefonnummer.

überprüfen, gehen zu können,

Ich würde vorschlagen, mit einem einfachen regulären Ausdruck überspringen Sie Ihre Telefonnummer an, zu testen und eine Bibliothek wie Google mit libphonenumber ( Link zu GitHub Projekt) .

Einführung libphonenumber!

eine Ihrer komplexere Beispiele verwenden, 1-234-567-8901 x1234 Sie eine href bekommen <= "https://libphonenumber.appspot.com/phonenumberparser?number=234-567-8901+x123&country=US&geocodingLocale=en-US" rel = "noreferrer"> 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

Also nicht nur lernen, wenn die Telefonnummer gültig ist (was es ist), aber auch konsequente Telefonnummer Formatierung in Ihrem Standort erhalten.

Als Bonus hat libphonenumber eine Anzahl von Datensätzen, die Gültigkeit der Telefonnummern zu überprüfen, wie gut, so eine Zahl wie +61299999999 Überprüfung (die internationale Version von (02) 9999 9999 ) liefert als eine gültige Nummer 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 gibt Ihnen auch viele zusätzliche Vorteile, wie zum Beispiel den Standort Grabbing, dass die Telefonnummer als erkannt wird, und auch die Zeitzoneninformationen aus der Telefonnummer bekommen:

PhoneNumberOfflineGeocoder Results
Location        Australia

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

Aber die ungültige australische Telefonnummer ( (09) 9999 9999 )gibt, dass es keine gültige Telefonnummer ist.

Validation Results

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

Google-Version hat Code für Java und Javascript, aber die Leute haben auch Bibliotheken für andere Sprachen implementiert, die den Google-i18n Telefonnummer-Datensatz verwenden:

Wenn Sie nicht sicher sind, dass Sie immer von einem locale akzeptieren Zahlen werden werden, und sie werden immer in einem Format sein werden, würde ich stark nicht empfehlen, Ihren eigenen Code für das Schreiben und mit libphonenumber zum Validieren und Anzeigen Telefonnummern.

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

Das paßt:

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

  1. Länderkennzeichen
  2. Telefonnummer
  3. Erweiterung

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

Auch wenn die Antwort alle Leerzeichen Streifen ordentlich ist, ist es nicht wirklich das Problem zu lösen, die gestellt ist, die einen regulären Ausdruck zu finden ist. Nehmen wir zum Beispiel, mein Test-Skript, das eine Web-Seite heruntergeladen und extrahiert alle Telefonnummern der Regex. Da Sie ohnehin einen regulären Ausdruck brauchen würde, könnte man genauso gut haben die Regex die ganze Arbeit zu tun. Ich kam mit dieser:

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 passen, $ 1 enthält die Ortsvorwahl, die Telefonnummer enthält $ 2 und $ 3 und $ 5 enthält die Erweiterung. Mein Testskript lädt eine Datei aus dem Internet und druckt alle Telefonnummern drin.

#!/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 \ W * zu \ ändern s * \ W? \ S * in der Regex es ein wenig zu straffen. Ich war nicht in Bezug auf die von der Regex denken, sagen wir, auf einem Formular Benutzereingaben validieren, wenn ich es geschrieben habe, aber diese Änderung macht es möglich, 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*))?';

, antwortete ich diese Frage auf eine andere SO Frage, bevor auch entscheiden, auf meine Antwort als Antwort auf diesem Thread schließen, weil niemand anspricht wie / nicht benötigt Einzelteile fordern, nur regexs Austeilen: Regex falsch arbeiten, unerwartete Dinge passende

Von meinem Beitrag auf dieser Seite habe ich eine kurze Anleitung erstellt jemand helfen mit ihrem eigenen regex machen für ihre eigene gewünschte Telefonnummer Format, das ich Caveat wird (wie ich auf der anderen Seite tat), dass, wenn Sie zu restriktiv, können Sie nicht die gewünschten Ergebnisse, und es gibt keine „one size fits all“ -Lösung alle möglichen Telefonnummern in der Welt zu akzeptieren - nur das, was Sie sich entscheiden, als Format der Wahl zu akzeptieren. Benutzung auf eigene Gefahr.

Schnell Spickzettel

  • Starten Sie den Ausdruck: /^
  • Wenn Sie einen Raum benötigen, verwenden Sie: [\s] oder \s
  • Wenn Sie Klammer benötigen, verwenden Sie: [(] und [)]. Mit \( und \) ist hässlich und kann die Dinge verwirrend machen.
  • Wenn Sie etwas optional sein wollen, setzen Sie ein ? nachdem es
  • Wenn Sie einen Bindestrich möchten, geben Sie einfach - oder [-]. Wenn Sie es nicht zuerst oder zuletzt in einer Reihe von anderen Zeichen setzen, obwohl, müssen Sie es entkommen: \-
  • Wenn Sie verschiedene Möglichkeiten in einem Schlitz annehmen möchten, setzen Sie Klammern um die Optionen: [-.\s] einen Bindestrich, Punkt oder Raum erfordern. Ein Fragezeichen nach der letzten Klammer wird alle diejenigen, optional für diesen Schlitz machen.
  • \d{3}: Erfordert eine 3-stellige Nummer: 000-999. Stenografie für [0-9][0-9][0-9].
  • [2-9]: Erfordert eine Ziffer 2-9 für diesen Schlitz
  • .
  • (\+|1\s)?: als "plus" oder eine 1 und ein Raum (Pipezeichen, |, ist "oder"), und es optional machen. Das "Plus" -Zeichen müssen entwertet werden.
  • Wenn Sie bestimmte Zahlen wollen einen Schlitz passen, geben Sie diese: [246] eine 2, 4 oder 6 [77|78] benötigen 77 oder 78 erforderlich
  • .
  • $/: Beenden Sie den Ausdruck

Ich schrieb simpliest (obwohl ich nicht in sie Punkt brauchte).

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

Wie weiter unten erwähnt, überprüft er nur für Zeichen, nicht seine Struktur / order

Beachten Sie, dass () Zeichen Strippen nicht für einen Stil Zahlen schreiben UK funktioniert, das gemeinsam ist: +44 (0) 1234 567890, die entweder die internationale Nummer bedeutet wählen:
+441234567890
oder im Vereinigten Königreich Wahl 01234567890

Wenn Sie nur überprüfen wollen Sie nicht zufällig Müll auf dem Feld (das heißt von Form Spammer) diese regex sollte gut tun:

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

Beachten Sie, dass es keine besonderen Regeln für die hat, wie viele Ziffern oder Zahlen, was in diesen Ziffern gültig sind, überprüft er nur, dass nur Ziffern, Klammern, Bindestriche plus, Raum, Pfund, Stern, Punkt, Komma, oder die Buchstaben e, x, t vorhanden sind.

Es sollte mit internationalen Nummern und Lokalisierungsformaten kompatibel sein. Planen Sie eine Notwendigkeit, Platz, lockig oder spitze Klammern für einige Regionen zu ermöglichen? (Zur Zeit sind sie nicht enthalten).

Wenn Sie pro Ziffer Regeln beibehalten werden sollen (wie in der US-Postleitzahlen und Vorwahlen (AKZ) im Bereich von 200 bis 999 fallen müssen) gut, viel Glück für Sie. Die Aufrechterhaltung eines komplexen Regelsatz, die an jedem beliebigen Punkt in der Zukunft von jedem Land der Welt klingt nicht Spaß veraltet sein könnten.

Und während alle Strippen / die meisten nicht-numerischen Zeichen arbeiten kann auch auf der Serverseite (vor allem, wenn Sie auf vorbeifahrende Werten einen Dialer planen), können Sie nicht wollen, die Eingabe des Benutzers bei der Validierung dreschen, vor allem, wenn Sie will, dass sie Korrekturen in einem anderen Feld machen.

Haben Sie hatte einen Blick über RegExLib ?

Einreise in US-Telefonnummer bringt eine ganze Liste von Möglichkeiten.

Mein Versuch einer unrestrictive regex:

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

Akzeptiert:

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

Rejects:

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

Es ist an Ihnen, es für die Anzeige zu sanieren. Nachdem es die Validierung könnte obwohl eine Zahl sein.

Ich fand das ganz gut funktionieren:

^\(*\+*[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, flags global und mehrzeilige verwenden, um sicherzustellen.

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

Wenn Sie sprechen Formularvalidierung, die regexp richtige Bedeutung und zu validieren als korrekte Daten wird extrem komplex sein, weil von Land und Anbieter Standards variieren. Es wird auch auf dem Laufenden zu bleiben hart sein.

interpretiere ich die Frage für ein breiten gültiges Muster suchen, die möglicherweise nicht konsistent sein - einen gültigen Satz von Zahlen mit beispielsweise, aber nicht validieren, dass die Stamm-Linie, Austausch usw. das gültigen Muster für die Landesvorwahl.

Nordamerika ist unkompliziert und für internationale ziehe ich eine ‚idiomatische‘ Muster zu verwenden, die die Art und Weise, in der Menschen abdeckt angeben und erinnern sich an ihre Zahlen:

^((((\(\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 sind. Die internationalen Konten für einen optionalen anfänglichen ‚+‘ und Ländercode. Danach sind Sie in dem Idiom. Gültige Matches wäre:

  • (xxx)xxx-xxxx
  • (xxx)-xxx-xxxx
  • (xxx)xxx-xxxx x123
  • 12 1234 123 1 x1111
  • 12 12 12 12 12
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678

Dies kann voreingenommen sein, wie meine Erfahrung in Nordamerika, Europa und ein klein bisschen Asien beschränkt ist.

Mein Bauchgefühl durch die Menge an Antworten zu diesem Thema verstärkt -., Dass es eine nahezu unendliche Anzahl von Lösungen für dieses Problem ist, von denen keiner geht elegant sein

Ehrlich gesagt, würde ich empfehlen Sie nicht versuchen, Telefonnummern zu bestätigen. Selbst wenn Sie einen großen, haarigen Validator schreiben könnten, die die verschiedene legitimen Formate erlauben würde, wäre es so ziemlich alles erlaubt auch nur entfernt ähnlich eine Telefonnummer an erster Stelle enden.

Meiner Meinung nach ist die eleganteste Lösung ist eine Mindestlänge zu bestätigen, sonst nichts.

Dies ist ein einfaches Muster für reguläre Ausdrücke für Philippine Handy-Nummern:

((\+[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 diese entsprechen:

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

Die erste wird ANY zweistelligen Ländercode entsprechen, während der zweite die Philippine Ländercode ausschließlich entsprechen.

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

Sie haben eine harte Zeit mit internationalen Nummern mit einer einzigen / einfachen Regex zu tun haben, finden Sie unter dieser Beitrag auf den Schwierigkeiten bei den internationalen (und sogar nordamerikanischen) Telefonnummern.

Hier finden Sie die ersten Ziffern analysieren wollen, um zu bestimmen, was der Landesvorwahl, dann anders handelt basierend auf dem Land.

Darüber hinaus - die Liste, die Sie gab keinen weiteren gemeinsamen US-Format enthalten - die anfänglichen 1. Die meisten Handys in den USA Weglassen erfordern es nicht, und es wird beginnen, die jüngere Generation verblüffen, es sei denn sie haben gewählt international.

Sie haben richtig erkannt, dass es ein schwieriges Problem ...

-Adam

Hier ist ein wunderbares Muster, die am ehesten die Validierung abgestimmt, dass ich zu erreichen benötigt. Ich bin nicht der ursprüngliche Autor, aber ich denke, es ist gut es wert, wie ich dieses Problem gefunden sehr komplex zu sein und ohne eine prägnante oder weit nützliche Antwort.

Die folgende Regex wird weit verbreitet Anzahl und Zeichenkombinationen in einer Vielzahl von globaler Telefonnummer Formaten fängt:

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

Hier ist mein Bestes versuchen, so weit. Er verarbeitet die Formate oben, aber ich bin sicher, dass ich einige andere mögliche Formate bin fehlt.

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

Nach dem durch diese Antworten zu lesen, es sieht aus wie es war keine einfacher regulärer Ausdruck, der durch ein Bündel von Text analysieren kann, und ziehen Sie Telefonnummern in einem beliebigen Format (einschließlich dem internationalen mit und ohne das Pluszeichen).

Hier ist, was ich für ein Client-Projekt vor kurzem verwendet, wo wir alle Telefonnummern in einem beliebigen Format zu tel hatte zu konvertieren. Links

Bisher es hat sich mit allem, was arbeiten sie auf sie geworfen haben, aber wenn Fehler kommen, ich werde diese Antwort aktualisieren.

Regex:

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

PHP-Funktion alle Telefonnummern mit tel ersetzen: Links (falls es jemand neugierig):

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

Ich glaube, die Nummer :: Telefon :: US und Regexp :: Allgemeiner (insbesondere die Quelle Regexp :: Allgemeine :: URI :: RFC2806 ) Perl-Module helfen könnte.

Die Frage sollte wohl in etwas näher spezifiziert werden, um den Zweck der Validierung der Zahlen zu erklären. Zum Beispiel ist 911 eine gültige Zahl in den USA, aber 911x ist nicht für jeden Wert von x. Das ist so, dass die Telefongesellschaft berechnen, wenn Sie wählen sind fertig. Es gibt mehrere Varianten zu diesem Thema. Aber Ihre regex prüft nicht den Bereich Codeabschnitt, so dass kein Problem zu sein scheint.

Wie E-Mail-Adressen Validierung, auch wenn Sie ein gültiges Ergebnis haben, können Sie nicht wissen, ob es jemandem zugewiesen ist, bis Sie es versuchen.

Wenn Sie versuchen, eine Benutzereingabe zu überprüfen, warum das Ergebnis nicht normalisieren und mit ihr geschehen? Wenn der Benutzer in einer Reihe setzt können Sie nicht als gültige Zahl, erkennen sie entweder speichern, wie eingegeben oder undailable Zeichen Streifen aus. Die Nummer :: Telefon :: Normalisieren Perl-Modul eine Quelle der Inspiration sein könnte.

Ich arbeite für ein Marktforschungsunternehmen, und wir haben diese Arten von Eingängen alllll die Zeit zu filtern. Du verkompliziert es zu viel. Streifen Sie die nicht-alphanumerischen Zeichen, und sehen, ob es eine Erweiterung ist.

Zur weiteren Analyse können Sie eine von vielen Anbietern abonnieren, der Sie auf eine Datenbank mit gültigen Nummern zugreifen geben so gut wie Sie sagen, wenn sie Festnetz- oder Mobil sind, getrennt, etc. Es kostet Geld.

ein Ersetzen Zeichen zur Formatierung, dann überprüfen Sie die restlichen für Telefon Gültigkeit. 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 );

Brechen eines komplexen regexp wie diese können genauso effektiv sein, aber viel einfacher.

Ich fand das etwas interessant zu sein. Ich habe getestet es nicht, aber es sieht aus, als ob es funktionieren würde

<?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.';
}
?>

Sie würden wahrscheinlich besser dran, einen maskierten Eingang für diese Verwendung. Auf diese Weise können Benutzer nur Zahlen eingeben und Sie können formatiert aber Sie sehen, passen. Ich bin mir nicht sicher, ob dies für eine Web-Anwendung ist, aber wenn es da ist, ist eine sehr klicken jQuery-Plugin, dies zu tun einige Optionen bietet.

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

Sie gehen sogar darüber, wie Telefonnummer Eingänge in ihrem Tutorial zu maskieren.

Hier ist eine, die gut in JavaScript funktioniert. Es ist in einem String, weil das ist, was der Dojo-Widget erwartet hat.

Es entspricht einer 10-stelligen Nordamerika NANP-Nummer mit optionaler Erweiterung. Leerzeichen, Bindestriche und Perioden akzeptieren Begrenzer.

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

ich mit dem gleichen Problem zu kämpfen hatte und versuchte, meine Anwendung zukunftssicher zu machen, aber diese Jungs haben mich in die richtige Richtung. Ich bin eigentlich nicht die Nummer Überprüfung selbst zu sehen, ob es funktioniert oder nicht, ich versuche nur, um sicherzustellen, dass eine Reihe von Zahlen eingegeben wurde, die keine Erweiterung hat oder nicht.

Im schlimmsten Fall, wenn der Benutzer eine unformatierte Nummer aus der XML-Datei ziehen hätten, würden sie immer noch geben Sie einfach die Zahlen in den Nummernpad 012345678x5 Telefon, keinen wirklichen Grund, es ist ziemlich zu halten. Diese Art von RegEx wäre für mich so etwas wie diese kommen:

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

Meine Neigung ist sich einig, dass nicht-Ziffern Strippen und nur akzeptieren, was ist es am besten ist. Vielleicht am wenigsten, um sicherzustellen, an ein paar Stellen vorhanden sind, aber das ist so etwas wie eine alphabetische Telefonnummer „ASK-JAKE“ zum Beispiel verbietet es.

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

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

Mit dem ersten zusammen mit den Zifferngruppen zu halten, die Formatierung Hinweise geben kann. Verwenden Sie die zweiten zu trivial alle Nicht-Ziffern werfen.

Ist es eine Sorge, dass es braucht eine Pause und dann eingegeben mehr Schlüssel? Oder so etwas wie 555-1212 (warten Sie auf den Piepton) 123?

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

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

Für alle mit Interesse an etwas ähnlichem mit Irish Handy-Nummern zu tun, hier ist eine einfache Möglichkeit, es 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 auf diesem Link.

EDIT:

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top