Pilnas telefono numerio tikrinimo regex

Bandau surinkti išsamią telefono numerių tikrinimo sistemą. Idealiu atveju ji tvarkytų tarptautinius formatus, tačiau ji turėtų tvarkyti JAV formatus, įskaitant:

  • 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

Atsakysiu su savo dabartiniu bandymu, bet tikiuosi, kad kažkas turi kažką geresnio ir / ar elegantiškesnio.

839
23 сент. Nicholas Trandem nustatė rugsėjo 23 d 2008-09-23 23:13 '08 at 23:13 pm 2008-09-23 23:13
@ 39 atsakymų
  • 1
  • 2

Geriausias variantas ... tiesiog patraukite visus be parašo simbolius prie įėjimo (išskyrus „x“ ir „pirmaujančius“ + ženklus), įsitikinkite, kad britų tendencija parašyti numerius nestandartine forma +44 (0) ... kai paprašoma naudoti tarptautinius priešdėlis (šiuo konkrečiu atveju jūs turite visiškai atsisakyti (0) ).

Tada gausite vertes, pavyzdžiui:

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

Tada, kai parodysite, performuokite savo širdies turinį. Pavyzdžiui.

  1 (234) 567-8901 1 (234) 567-8901 x1234 
489
23 сент. Atsakymas, kurį pateikė scunliffe rugsėjo 23 d 2008-09-23 23:35 '08 at 23:35 pm 2008-09-23 23:35

Paaiškėjo, kad yra kažkas panašaus į specifikaciją, bent jau Šiaurės Amerikoje, vadinamoje NANP .

Turite tiksliai nurodyti, ką norite. Kas yra teisiniai ribotojai? Trūkumai, brūkšneliai ir laikotarpiai? Negalima naudoti separatoriaus? Ar galima sumaišyti separatorius (pvz., + 0.111-222.3333)? Kaip bus tvarkomi plėtiniai (pvz., 111-222-3333 x 44444)? Kaip apie specialius numerius, pavyzdžiui, 911? Ar regioninis kodas yra neprivalomas ar privalomas?

border=0

Čia, reguliari 7 arba 10 skaitmenų skaičiaus su galiojančiais plėtiniais išraiška, ribotojai yra tarpai, brūkšneliai ar laikotarpiai:

 ^(?:(?:\+?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+))?$ 
282
23 сент. Atsakymą pateikė Justin R. 23 rugsėjo. 2008-09-23 23:32 '08 at 11:32 2008-09-23 23:32
 .* 

Jei vartotojas nori suteikti savo telefono numerį, pasitikėkite, kad jis būtų teisingas. Jei jis nenori jums to suteikti, tada priversti jį įvesti numerį, jis atsiųs jį į konkurentų svetainę arba priverčia jį įvesti atsitiktinę eilutę, atitinkančią jūsų įprastą išraišką. Aš netgi gali būti linkęs surasti aukščiausios kokybės lytinės linijos sumą ir ją įvesti.

Taip pat norėčiau apsvarstyti bet kurį iš šių veiksmų kaip galiojančius įrašus svetainėje:

 "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" 
278
07 авг. atsakymą pateikė Dave Kirby 07 rug. 2009-08-07 20:24 '09 ne 20:24 2009-08-07 20:24

Taip pat siūlau žiūrėti „google libfonenumber“ biblioteką. Žinau, kad tai nėra reguliari išraiška, bet tai, ką norite.

Pavyzdžiui, jis pripažįsta, kad:

 15555555555 

yra galimas skaičius, bet ne realus skaičius. Jis taip pat remia šalis, nepriklausančias JAV.

Pagrindinės funkcijos:

  • Išsamiau / formatuokite / patvirtinkite telefono numerius visoms pasaulio šalims / regionams.
  • getNumberType - gauna numerio tipą, remiantis pačiu numeriu; gali atskirti fiksuotą, mobilųjį, nemokamą, priemoką, bendrą kainą, VoIP ir asmeninius numerius (jei įmanoma).
  • isNumberMatch - pasitiki, ar du numeriai gali būti vienodi.
  • getExampleNumber / getExampleNumberByType - suteikia galiojančius mėginių numerius visoms šalims / regionams, nurodant, kokio tipo telefono numerį reikia.
  • isPossibleNumber - greitai spėja, ar numeris yra galimas skambučio numeris, naudojant tik ilgio informaciją, daug greičiau nei pilnas patikrinimas.
  • isValidNumber - pilnas regiono telefono numerio patikrinimas naudojant ilgio ir prefikso informaciją.
  • AsYouTypeFormatter - formatuoja telefonų numerius, kai naudotojai įveda kiekvieną skaičių.
  • findNumbers - suranda teksto įvesties numerius.
  • PhoneNumberOfflineGeocoder - suteikia geografinę informaciją, susijusią su telefono numeriu.

Pavyzdžiai

Didžiausia problema dėl telefono numerio tikrinimo yra labai priklausoma nuo kultūros.

  • Amerika
    • (408) 974–2042 yra galiojantis JAV numeris
    • (999) 974–2042 nėra galiojantis JAV numeris.
  • Australija
    • 0404 999 999 yra galiojantis Australijos numeris
    • (02) 9999 9999 pat yra galiojantis Australijos numeris
    • (09) 9999 9999 nėra galiojantis Australijos numeris

Reguliarus išraiška puikiai tinka telefono numerio formatui patikrinti, tačiau iš tikrųjų neįmanoma patikrinti telefono numerio teisingumo.

Siūlyčiau praleisti paprastą reguliarią išraišką, kad patikrintumėte savo telefono numerį, ir naudokite biblioteką, pvz., „Google libphonenumber (nuoroda į „GitHub“ projektą) .

Pristatome libphonenumber!

Naudodami vieną iš sudėtingesnių pavyzdžių, 1-234-567-8901 x1234 , gausite šiuos duomenis iš libphonenumber (nuoroda į internetinę demonstraciją) :

 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 

Tokiu būdu jūs ne tik sužinosite, ar telefono numeris (kaip jis yra), bet ir nuosekliai formuojate savo regiono telefono numerį.

libphonenumber kaip premija, turi daug duomenų rinkinių, kuriais patikrinamas telefono numerių galiojimas, todėl numerio, pvz., +61299999999 (tarptautinė versija (02) 9999 9999 ), tikrinimas grąžinamas kaip galiojantis numeris su formatavimu:

 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“ taip pat suteikia daug papildomų privalumų, pvz., Užfiksuoti vietą, kurioje randamas telefono numeris, ir gauti laiko juostos informaciją iš telefono numerio:

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

Bet negaliojantis Australijos telefono numeris ( (09) 9999 9999 ) grąžina, kad tai nėra galiojantis telefono numeris.

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

„Google“ versija turi „Java“ ir „Javascript“ kodą, tačiau žmonės taip pat įdiegė kitas kalbas, kurios naudoja „Google i18n“ telefono duomenų rinkinį:

Jei nesate tikri, kad visada sutiksite numerius iš tos pačios vietovės, ir jie visada bus to paties formato, aš primygtinai rekomenduoju nenurodyti savo kodo ir naudoti libphonenumber, kad patikrintumėte ir rodytumėte telefono numerius.

138
26 марта '13 в 21:13 2013-03-26 21:13 atsakymas pateikiamas Halfwarr kovo 26 d. 13 val. 2013-03-26 21:13

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

Tai atitinka:

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

Iš $ n jis išsaugo:

  1. Šalies rodiklis
  2. Telefono numeris
  3. plėtra

Galite jį išbandyti šiuo adresu : https://www.regexpal.com/?fam=99127

68
07 янв. atsakymą pateikė Ismael Miguel 07 Jan 2014-01-07 15:30 '14, 15:30, 2014-01-07 15:30

Nors atsakymas į visų erdvių žymėjimą yra tvarkingas, iš tikrųjų jis neišsprendžia įprastos raiškos paieškos problemos. Paimkite, pavyzdžiui, mano testo scenarijų, kuris įkelia tinklalapį ir ištraukia visus telefono numerius naudodamas įprastą išraišką. Kadangi bet kuriuo atveju jums reikia reguliarios išraiškos, taip pat galite priversti įprastą išraišką atlikti visą darbą. Aš atėjau tai:

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

Čia yra perl scenarijus, kurį norite patikrinti. Kai sutinkate, $ 1 yra vietovės kodas, $ 2 ir $ 3 yra telefono numeris, o $ 5 - plėtinys. Mano testo scenarijus parsisiunčia failą iš interneto ir spausdina visus jame esančius telefono numerius.

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

Redaguoti:

Jei norite šiek tiek sugriežtinti, galite reguliariai išrinkti W * į * W? Negalėjau galvoti apie reguliarią išraišką, pvz., Tikrinant vartotojo įvestį formoje rašant, tačiau šis pakeitimas leidžia šiam tikslui naudoti reguliarią išraišką.

 '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*))?'; 
62
24 сент. atsakymas pateikiamas indiv 2008-09-24 00:58 '08 at 0:58 2008-09-24 00:58

Atsakydamas į atsakymą į šį srautą, atsakiau į šį klausimą kitame SO klausime, nes niekas nebendradarbiavo, kaip pareikalauti / nereikalauti elementų, tiesiog platindamas reguliarias išraiškas: „ Regex“ neveikia teisingai, neatitinka netikėto dalykų

Iš mano skelbimo šioje svetainėje sukūriau trumpą pamoką, kuri padėjo kam nors sukurti savo įprastą išraišką savo telefono numerio formatu, apie kurį aš įspėsiu (pvz., Tai padariau kitoje svetainėje), jei esate pernelyg ribojantis, Jūs negalite gauti norimų rezultatų, ir nėra „vieno dydžio visiems“ sprendimo, leidžiančio priimti visus galimus telefono numerius pasaulyje - tai, ką nuspręsite priimti kaip pasirinkimo formatą. Naudokite savo pačių rizika.

Greitas „cheat“ lapas

  • Paleiskite išraišką: /^
  • Jei reikia vietos, naudokite: [\s] arba
  • Jei norite reikalauti skliausteliuose, naudokite: [(] ir [)] . Naudojant \( ir \) yra negraži ir gali būti paini.
  • Jei norite, kad kažkas būtų neprivaloma, įdėkite ? po jo
  • Jei norite brūkšnelį, tiesiog įveskite - arba [-] . Jei nenorite įdėti pirmosios ar paskutinės eilės kitų simbolių, jums gali tekti to išvengti: \-
  • Jei norite, kad lizde priimtumėte įvairias parinktis, įkiškite skliaustelius aplink parametrus: [-.\s] Po paskutinio skliauto pateikto klausimo ženklo visi šie lizdai bus neprivalomi.
  • \d{3} : Reikalingas 3 skaitmenų skaičius: 000-999. [0-9][0-9][0-9] santrumpa.
  • [2-9] : šiame lizde reikia skaičiaus 2-9.
  • (\+|1\s)? : Priimkite „plius“ arba 1 ir tarpą (vamzdžio simbolis, | , „arba“) ir pasirenkama. Pliuso ženklas turi būti ištrūkęs.
  • Jei norite, kad tam tikri numeriai atitiktų lizdą, įveskite juos: [246] reikės 2, 4 arba 6. [77|78] reikės 77 arba 78.
  • $/ : Baigti išraišką
39
14 авг. atsakymą pateikė vapcguy 14 rug . 2014-08-14 05:00 '14, 5:00 2014-08-14 05:00

Aš parašiau paprasčiausią (nors man to nereikia).

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

Kaip nurodyta toliau, ji tikrina tik simbolius, o ne jos struktūrą / tvarką.

27
04 февр. Atsakymą pateikė Artjom Kurapov 04 vasaris. 2010-02-04 12:52 '10, 12:52, 2010-02-04 12:52

Atkreipkite dėmesį, kad aprašai () neveikia dėl JK numerių rašymo stiliaus, kuris yra bendras: +44 (0) 1234 567890 , o tai reiškia tarptautinio numerio rinkimą:
+441234567890
arba skambinkite JK 01234567890

22
21 марта '10 в 19:32 2010-03-21 19:32 Atsakymą davė Ben Clifford , kovo 21 d., 10 val. 19:32 2010-03-21 19:32

Jei tik norite patikrinti, ar lauke nėra atsitiktinių šiukšlių (t. Y. Iš formų nepageidaujamų laiškų siuntėjų), ši įprastinė išraiška turėtų būti gražiai daroma:

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

Atkreipkite dėmesį, kad jis neturi jokių specialių taisyklių, kiek numerių ar numerių galioja šiuose numeriuose, jis tik patikrina, ar tik numeriai, skliausteliai, brūkšneliai, plius, erdvė, svaras, žvaigždutė, laikotarpis, kablelis, ar raidės e , x , t .

Jis turi būti suderinamas su tarptautiniais numeriais ir lokalizacijos formatais. Ar reikia kai kuriems regionams leisti kvadratinius, garbanotus ar kampinius laikiklius? (jie šiuo metu nėra įtraukti).

Jei norite išlaikyti kiekvieno skaitmens taisykles (pvz., JAV kodai ir priešdėliai (mainų kodai), kurie turėtų būti nuo 200 iki 999), sėkmės jums. Išlaikyti sudėtingą taisyklių rinkinį, kuris ateityje gali būti pasenęs bet kurioje pasaulio šalyje, neatrodo juokingas.

Ir nors serverio pusėje ištrinant visus / ne skaitmeninius simbolius gali būti gerai (ypač jei planuojate siųsti šias vertes į rinkiklį), tikrinimo metu gali nenorėti viršyti vartotojo įvesties, ypač jei norite, kad jie ištaisytų kitą lauką. .

18
16 авг. Steve atsakė rugpjūčio 16 d 2012-08-16 00:21 '12 12:21 AM 2012-08-16 00:21

Ar peržiūrėjote „ RegExLib“ ?

Įvedus skaičių JAV, atsirado funkcijų sąrašas.

14
23 сент. Rob Wells atsakymas, rugsėjo 23 d 2008-09-23 23:19 '08 at 11:19 pm 2008-09-23 23:19

Mano bandymas neribotai reguliariai išraiška

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

Priima:

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

Nukrypimas:

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

Tai priklauso nuo jūsų, kad jį išvalytumėte ekrane. Patikrinus, tai gali būti skaičius.

12
09 марта '12 в 18:31 2012-03-09 18:31 atsakymas pateikiamas „ ReactiveRaven“ kovo 09 d. 12 val. 18:31 2012-03-09 18:31

Radau, kad tai veikia labai gerai:

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

Jis veikia šiems formatams:

 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 

Būtinai naudokite pasaulines ir kelių eilučių žymes.

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

12
12 сент. Atsakymas duotas Herobrine2Nether 12 Sep. 2015-09-12 01:02 '15 - 1:02 2015-09-12 01:02

Jei kalbate apie formos patvirtinimą, reguliariai išreikšti teisingą vertę ir teisingus duomenis bus labai sunku dėl skirtingų šalių ir tiekėjų standartų. Taip pat bus sunku atnaujinti.

Šį klausimą aš aiškinu kaip plačiai galiojančio modelio, kuris negali būti vidinis nuoseklumas, paieška, pavyzdžiui, turint galiojantį skaičių rinkinį, bet ne tikrinant, ar magistralinė linija, mainai ir kt. galiojantį prefikso šalies kodo šabloną.

Šiaurės Amerika yra paprasta, o tarptautiniu mastu norėčiau naudoti „idiomatinį“ šabloną, kuris apima būdus, kuriais žmonės nurodo ir įsimena jų numerius:

 ^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$ 

Šiaurės Amerikos pavyzdys užtikrina, kad jei yra vienas laikiklis, tai yra. Tarptautinės sąskaitos už pasirenkamą pradinį „+“ ir šalies kodą. Po to tu esi idioma. Galiojančios rungtynės:

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

Tai gali būti šališka, nes mano patirtis apsiriboja Šiaurės Amerika, Europa ir nedideliu Azijos kiekiu.

11
10 апр. atsakymas pateikiamas ron0 10 balandžio. 2009-04-10 15:21 '09, 15:21, 2009-04-10 15:21

Tai paprastas filipiniečių mobiliųjų telefonų numerių išraiška:

 ((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4} 

arba

 ((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4} 

atitiks šiuos:

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

Pirmasis atitiks bet kokį dviejų skaitmenų šalies kodą, o antrasis - tik Filipinų šalies kodą.

Išbandykite ją čia: http://refiddle.com/1ox

10
18 янв. Atsakymas GaiusSensei 18 sausio. 2012-01-18 04:23 '12 at 4:23 am 2012-01-18 04:23

Mano jausmą stiprina atsakymų į šią temą skaičius - tai yra beveik begalinis šios problemos sprendimo variantų, kurių nė vienas nebus elegantiškas.

Sąžiningai, norėčiau rekomenduoti ne bandyti patikrinti telefono numerius. Net jei galėtumėte parašyti didelį plaukuotą validatorių, kuris leistų naudoti visus skirtingus teisinius formatus, tai galiausiai leistų beveik viskas, netgi nuotoliniu būdu, panašus į telefono numerį.

Mano nuomone, labiausiai elegantiškas sprendimas yra patikrinti minimalų ilgį, nieko daugiau.

9
14 апр. Atsakymas pateikiamas mindplay.dk balandžio 14 d. 2011-04-14 23:56 '11, 11:56 PM 2011-04-14 23:56

Jums bus sunku dirbti su tarptautiniais numeriais, naudojant vieną / paprastą reguliarią išraišką, žiūrėkite šį įrašą apie tarptautinio (ir net šiaurinio) telefono numerio sunkumus.

Turite išanalizuoti kelis pirmuosius skaitmenis, kad nustatytumėte, koks yra šalies kodas, ir tada veikite skirtingai, priklausomai nuo šalies.

Be to, jūsų pateiktame sąraše nėra kito bendro JAV formato - paliekant pradinį, dauguma JAV mobiliųjų telefonų to nereikalauja, ir ji pradės dezorientuoti jaunąją kartą, jei jie nebus surinkti tarptautiniu mastu.

Jūs teisingai nustatėte, kad tai yra sudėtinga problema ...

-Adam

8
23 сент. atsakymą pateikė Adam Davis, rugsėjo 23 d 2008-09-23 23:51 '08 at 11:51 pm 2008-09-23 23:51

Čia yra puikus pavyzdys, labiausiai atitinkantis bandymą, kurį turėjau pasiekti. Aš nesu originalus autorius, bet manau, kad verta tai, ką manau ši problema yra labai sudėtinga ir be trumpų ar plačiai naudingų atsakymų.

Toliau pateikta reguliarioji išraiška bus naudojama plačiai naudojami numerių ir simbolių deriniai įvairiuose pasaulio telefono numerių formatuose:

/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm

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

Neigiamas:
926 3 4
8 800 600 APPLE

Šaltinis: http://www.regexr.com/38pvb

8
24 апр. Atsakymą pateikė Stuart Kershaw balandžio 24 d. 2015-04-24 01:18 '15 ne 1:18 2015-04-24 01:18

Perskaičius šiuos atsakymus, atrodo, kad nėra paprastos reguliarios išraiškos, kuri galėtų analizuoti teksto krūva ir ištraukti telefono numerius bet kokiu formatu (įskaitant tarptautinius, su ir be pliuso ženklo).

Štai ką neseniai naudojome kliento projektui, kuriame turėjo būti konvertuoti visi telefono numeriai bet kokiu formatu į tel: links.

Iki šiol jis dirbo su viskuo, ką jie moka į jį, bet jei atsiras klaidų, atnaujinsiu šį atsakymą.

Regex:

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

PHP funkcija pakeisti visus telefono numerius telefonu: nuorodos (jei kas nors domina):

 function phoneToTel($number) { $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international return $return; } 
8
08 июля '14 в 21:28 2014-07-08 21:28 atsakymas buvo duotas Drew Thomas'ui liepos 14 d. 14:28, 2014-07-08 21:28

Čia yra mano geriausias bandymas. Jis tvarko aukščiau nurodytus formatus, bet esu tikras, kad trūksta kitų galimų formatų.

 ^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$ 
7
23 сент. Nicholas Trandem atsakymas rugsėjo 23 d 2008-09-23 23:14 '08 at 23:14 pm 2008-09-23 23:14

Manau, kad skaičius :: Phone :: US ir Regexp :: Common (ypač šaltinis Regexp :: Common :: URI :: RFC2806 ). Perl moduliai gali padėti.

Tikriausiai klausimas turėtų būti išsamiau apibrėžtas, kad būtų paaiškintas numerių tikrinimo tikslas. Pavyzdžiui, 911 yra galiojantis numeris Jungtinėse Valstijose, tačiau 911x neturi reikšmės x. Taip yra todėl, kad telefono ryšio bendrovė gali apskaičiuoti, kai baigsite rinkimą. Yra kelios šios problemos parinktys. Tačiau jūsų įprastinė išraiška nekontroliuoja dalies rajono kodo, todėl tai nėra problema.