Am'm încercarea de a pune împreună o cuprinzătoare regex pentru a valida numere de telefon. Ideal ar ocupa formate internaționale, dar trebuie să se ocupe de NOI formate, inclusiv următoarele:
Am'll răspuns cu actuala mea încercare, dar eu'm în speranța că cineva are ceva mai bun si/sau mai elegant.
Opțiune mai bună... doar fâșia non-cifre, caractere de la intrare (cu excepția 'x' și de conducere '+' semne), având grijă, din cauza Britanic tendința de a scrie numere în formă non-standard +44 (0) ...
atunci când a cerut să utilizați prefixul internațional (în acest caz specific, ar trebui să aruncați (0)
în întregime).
Apoi, te trezești cu valori ca:
12345678901
12345678901x1234
345678901x1234
12344678901
12345678901
12345678901
12345678901
+4112345678
+441234567890
Atunci când afișați, reformat la conținutul dvs. inimile. de exemplu
1 (234) 567-8901
1 (234) 567-8901 x1234
Se pare că acolo's ceva de un spec pentru acest lucru, cel puțin pentru America de Nord, numit NANP.
Trebuie să specificați exact ceea ce vrei. Ce sunt legale delimitatori? Spații, liniuțe, și perioade? Nu delimitator permis? Se poate amesteca delimitatori (de exemplu, +0.111-222.3333)? Cum sunt extensii (de exemplu, 111-222-3333 x 44444) va fi manipulat? Ce despre numere speciale, cum ar fi 911? Este zona de cod va fi opționale sau obligatorii?
Aici's un regex pentru un 7 sau 10 cifre, cu extensii permise, delimitatori sunt spații, linii, sau perioade:
^(?:(?:\+?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+))?$
.*
Dacă utilizatorul vrea să-ți dau numărul lui de telefon, atunci ai încredere în el să-l dreapta. Dacă el nu vrea să-l dea la tine, atunci forțându-l să introduceți un număr valid, fie va trimite-l la un concurent's site-ul sau să-l introduceți un șir aleator care se potrivește regex. Am putea fi chiar tentat să se uite în sus numărul de o rată de primă linie erotică și introduceți acest loc.
De asemenea, aș lua în considerare oricare dintre următoarele ca intrări valide pe un site web:
"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"
Aș sugera, de asemenea, în căutarea de la "libphonenumber" Google Library. Știu că nu este regex, dar face exact ceea ce vrei.
De exemplu, acesta va recunoaște că:
15555555555
este un număr posibil dar nu este un număr valid. Acesta susține, de asemenea, țări în afara SUA.
Repere de funcționalitate:
getNumberType
- se tipul de numărul bazează pe numărul în sine; capabil să distingă Fixă, telefonie Mobilă, fără Taxă, Tarif Premium, cu Cost Partajat, VoIP și Numere Personale (ori de câte ori este posibil).isNumberMatch
- se un nivel de încredere dacă două numere ar putea fi la fel.getExampleNumber
/getExampleNumberByType
- oferă exemplu valabil pentru toate țările/regiunile, cu opțiunea de a specifica ce tip de exemplu numărul de telefon este necesar.isPossibleNumber
- rapid ghicitul dacă un număr este un posibil număr de telefon utilizând numai lungimea de informații, mult mai repede decât o validare completă.isValidNumber
- plin de validare a unui număr de telefon pentru o regiune folosind lungime și prefix informații.AsYouTypeFormatter
- formate de numere de telefon pe-the-fly atunci când utilizatorii introduc fiecare cifră.findNumbers
- gaseste numerele din textul de intrare.PhoneNumberOfflineGeocoder
- oferă informații geografice referitoare la un număr de telefon. Cea mai mare problemă cu numărul de telefon de validare este foarte dependente din punct de vedere cultural.
(408) 974-2042
e un valabil NE-numărul(999) 974-2042
e nu este valabil NE-numărul0404 999 999
e un valabil Australian numărul(02) 9999 9999
este, de asemenea, un valabil Australian numărul(09) 9999 9999
e nu este valabil Australian numărulO expresie regulată este bine pentru verificarea format de un număr de telefon, dar l's nu într-adevăr va fi capabil de a verifica validitatea de un număr de telefon.
Aș sugera sărind peste o simplă expresie regulată pentru a testa numărul tău de telefon, împotriva, și folosind o bibliotecă, cum ar fi Google's libphonenumber
(link-ul de la proiect GitHub).
Folosind unul dintre cei mai complexe exemple, 1-234-567-8901 x1234
, veți obține următoarele date de libphonenumber` (link-ul de la demo on-line):
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
Deci, nu numai că veți afla dacă numărul de telefon este valabil (care este), dar veți obține, de asemenea, în concordanță formatare număr de telefon în setările regionale.
Ca un bonus, libphonenumber
are un număr de seturi de date pentru a verifica valabilitatea numerelor de telefon, precum și, astfel încât verificarea unui număr, cum ar fi +61299999999
(versiunea internațională a (02) 9999 9999
) se întoarce ca un număr valid cu formatare:
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, de asemenea, vă oferă multe beneficii suplimentare, cum ar fi hapsân locația în care numărul de telefon este detectat ca fiind, și, de asemenea, obtinerea informațiile despre fusul orar de la numărul de telefon:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Dar invalid Australian numărul de telefon ((09) 9999 9999
) se întoarce că nu este un număr de telefon valid.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
Google's version are cod pentru Java și Javascript, dar oamenii au, de asemenea, implementate biblioteci pentru alte limbi care folosesc Google i18n numărul de telefon set de date:
Dacă nu sunteți sigur că vă sunt întotdeauna o să fie acceptarea numerele de la unu locale, și ele sunt întotdeauna o să fie într-un singur format, aș puternic sugerez să nu-ți scrie propriul cod pentru acest lucru, și folosind libphonenumber pentru validarea și afișarea de numere de telefon.
`/^(?:(?:(?(?:00|+)([1-4]\d\d|[1-9]\d?))?)?[-.\ \\/]?)?((?:(?\d{1,})?[-.\ \\/]?){0,})(?:[-.\ \\/]?(?:#|ext.?|extensia|x)[-.\ \\/]?(\d+))?$/eu
Acest lucru se potrivește:
- (+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
Pe $n, se salvează:
Puteți testa pe https://www.regexpal.com/?fam=99127
Deși răspunsul la striptease toate spațiu este curat, nu't într-adevăr rezolva problema pe care o's a pozat, care este de a găsi un regex. Să luăm, de exemplu, testul meu script care descarcă o pagină web și extrase toate numerele de telefon folosind regex. De când te - 'd nevoie de un regex oricum, ai putea la fel de bine au regex face toate lucrările. Am venit cu asta:
1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?
Aici's un script perl pentru a o testa. Atunci când se potrivesc, $1 conține codul de zona, 2 $și $3 conțin numărul de telefon, și 5 dolari conține extensia. Testul meu script-ul descarcă un fișier de pe internet și imprimă toate numerele de telefon din acesta.
#!/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:
Puteți schimba \W pentru a \s\W?\s* în regex pentru a strânge un pic. Am fost't de gândire de regex în termeni de, să zicem, validarea introduse de utilizator într-un formular, atunci când am scris-o, dar această schimbare face posibilă utilizarea regex pentru acest scop.
'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*))?';
Am raspuns la aceasta intrebare pe un alt ASTFEL de întrebare înainte de a decide să includă, de asemenea, răspunsul meu ca un răspuns pe acest subiect, pentru că nimeni nu a fost abordarea modul de a solicita/nu solicita elemente, doar predarea regexs: https://stackoverflow.com/questions/25184823/regex-working-wrong-matching-unexpected-things/25298604#25298604
De la postul meu de pe acel site, am'am creat un ghid rapid pentru a ajuta pe cineva cu a face propriile lor regex pentru propria lor de telefon dorit format de număr, care nu va avertisment (cum am facut eu de pe alt site) că, dacă sunt prea restrictive, este posibil să nu obțineți rezultatele dorite, și nu există nici o "o mărime se potrivește tuturor" soluție de a accepta toate posibile numere de telefon din lume - doar ceea ce vă decideți să accepte ca formatul ales. Utilizați pe propriul risc.
/^
[\ile]
sau \s
. Folosind
(și
)` e urât și poate face lucruri confuze.?
după -
sau [-]
. Dacă nu se pune primul sau ultimul dintr-o serie de alte personaje, totuși, posibil să aveți nevoie pentru a scăpa de ea: \-
[-.\s]
va fi nevoie de o cratimă, perioada, sau spațiu. Un semn de întrebare după ultimul suportul va face toate cele opționale pentru care slot. \d{3}
: Necesită un număr de 3 cifre: 000-999. Prescurtare pentru
[0-9][0-9][0-9]
. [2-9]
: Necesită o cifră 2-9 pentru că slot.(\+|1\s)?
: Accepta un "plus" sau un 1 și un spațiu (conducta de caracter, |
, este "sau"), și face opțional. "plus" semn trebuie să fie scăpat.[246]
va fi nevoie de o 2, 4, sau 6. [77/78]
va avea nevoie 77 sau 78.$/
: End expresiaRețineți că stripping ()
personaje nu funcționează pentru un stil de a scrie numere de marea BRITANIE, care este comună: +44 (0) 1234 567890
ceea ce înseamnă fie formați numărul internațional:
+441234567890
sau în marea BRITANIE dial 01234567890
Dacă doriți doar să verificați dacă tu nu't au aleatoare de gunoi în domeniu (de exemplu, de la forma de spam) acest regex ar trebui să facă frumos:
^[0-9+\(\)#\.\s\/ext-]+$
Rețineți că aceasta nu't au orice reguli speciale pentru cât de multe cifre, sau ce numere sunt valabile in acele cifre, doar verifică dacă numai cifre, paranteze, linii, în plus, spațiu, lira, asterisc, punct, virgulă, sau literele "e", "x", " t " sunt prezente.
Acesta trebuie să fie compatibil cu numere internaționale și localizare formate. Prevezi orice este nevoie pentru a permite pătrat, cret, sau paranteze unghiulare pentru anumite regiuni? (în prezent, acestea sunt't inclus).
Dacă doriți să mențină pe cifre reguli (cum ar fi în NOI Coduri Zonă și Prefixe (coduri de schimb) trebuie să se încadreze în intervalul de 200-999) ei bine, noroc pentru tine. Menținerea unui complex set de reguli care ar putea fi depășite în orice moment în viitor de către orice țară din lume nu suna distractiv.
Și în timp ce stripping toate/cele mai multe caractere non-numerice pot lucra bine pe partea de server (mai ales dacă sunteți de planificare pe trecerea acestor valori de la un dialer), este posibil să nu doriți să thrash utilizator's de intrare în timpul validării, în special dacă vrei ca ei să facă corecții într-un alt domeniu.
Ai avut o privire la RegExLib?
Intrarea număr de telefon din SUA a adus înapoi destul de o listă de posibilități.
Încercarea mea de a o unrestrictive regex:
/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/
Acceptă:
+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww
Respinge:
mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911
Este până la tine pentru a steriliza pentru afișare. După validarea acestuia could fi un număr, deși.
Am găsit acest lucru să funcționeze destul de bine:
^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$
Acesta funcționează pentru aceste formate de număr:
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
Asigurați-vă că pentru a utiliza global ȘI multilinie steaguri pentru a face sigur.
Daca're vorbesc despre forma de validare, la regexp pentru a valida sensul corect precum și date corecte va fi extrem de complex, deoarece de diferite grade de țară și de furnizorul de standarde. Acesta va fi, de asemenea, greu pentru a ține la curent.
Eu interpretez întrebarea și căutarea pentru, în general, un model valid, care poate să nu fie consecvente pe plan intern - de exemplu, având un set valid de numere, dar nu cred că portbagajul-line, schimb valutar, etc. la model valid pentru codul de țară, prefixul.
America de nord este simplă și internațional pentru ca prefer sa folosesc un 'idiomatice' model care se referă la modalitățile în care oamenii specifica și amintiți-vă numerele lor:
^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$
America de Nord model face sigur că dacă o paranteză este inclus ambele sunt. Conturile internaționale pentru un opțional inițială '+' și codul de țară. După aceea,'re în idiom. Valabil meciuri ar fi:
(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
Acest lucru poate fi părtinitoare ca experiența mea este limitată la America de Nord, Europa și un pic mic de Asia.
Impresia mea este întărită de cantitatea de răspunsurile la acest subiect - că există un număr practic infinit de soluții la această problemă, dintre care niciunul nu sunt de gând să fie elegant.
Sincer, mi-ar recomanda don't încercați să validați numere de telefon. Chiar dacă ai putea scrie un mare, păros validator, care ar permite toate diferite legitime formate, se va sfârși, permițându-ceva destul de mult, chiar de la distanță seamănă cu un număr de telefon în primul rând.
În opinia mea, soluția cea mai elegantă este de a valida o lungime minimă, nimic mai mult.
Aceasta este o simplă Expresie Regulată model pentru Filipine Numere de Telefon Mobil:
((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}
sau
((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}
se va potrivi aceste:
+63.917.123.4567
+63-917-123-4567
+63 917 123 4567
+639171234567
09171234567
Primul care se va potrivi ORICE două cifre, codul de țară, în timp ce al doilea va meci Filipine codul de țară exclusiv.
Testați-l aici: http://refiddle.com/1ox
Aici's un minunat model care cel mai strâns corelate de validare care am nevoie pentru a realiza. Am'm nu autorul original, dar cred că's bine în valoare de partajare cum am găsit această problemă să fie foarte complexe și fără concis sau pe scară largă a răspuns util.
Următoarele regex va prinde utilizate pe scară largă numărul și combinații de caractere într-o varietate de global numărul de telefon formate:
/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm
Pozitiv:
+42 555.123.4567
+1-(800)-123-4567
+7 555 1234567
+7(926)1234567
(926) 1234567
+79261234567
926 1234567
9261234567
1234567
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 416 555 9292
Negativ:
926 3 4
8 800 600-APPLE
Original sursa: http://www.regexr.com/38pvb
Te'll au un timp de greu se ocupă cu numere internaționale cu un singur/simplu regex, a se vedea acest mesaj cu privire la dificultățile internaționale (și chiar america de nord) numere de telefon.
Te'll doriți pentru a analiza primele câteva cifre pentru a determina ce codul de țară este, apoi să acționeze diferit în funcție de țară.
Dincolo de faptul că - lista-ai dat nu include o altă comună NE-a format - lăsând în afara inițiale 1. Cele mai multe telefoane mobile în SUA don't nevoie de ea, și-l'll începe să izbească tânăra generație excepția cazului în care acestea'am sunat la nivel internațional.
Te'am identificat corect pe care-l's o problemă delicată...
-Adam
Aici's încerca meu cel mai bun de până acum. Acesta se ocupă de formatele de mai sus, dar am'sunt sigur că am'm lipsesc unele alte formate posibile.
^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
După ce a citit prin aceste răspunsuri, se pare ca nu a fost't o simplă expresie regulată care se poate analiza prin o grămadă de text și scoate numere de telefon în orice format (inclusiv internaționale, cu și fără semnul plus).
Aici's ceea ce am folosit pentru un client proiect recent, unde am avut de a converti toate numerele de telefon în orice format la tel: link-uri.
Până în prezent, l's a fost de lucru cu tot ce au'am aruncat la ea, dar dacă erorile de vină, am'll actualiza acest răspuns.
Regex:
/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/
Funcția PHP pentru a înlocui toate numerele de telefon cu tel: link-uri (in caz ca cineva e curios):
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;
}