Normal ifadeleri kullanarak telefon numaralarını doğrulama


920

Telefon numaralarını doğrulamak için kapsamlı bir regex oluşturmaya çalışıyorum. İdeal olarak uluslararası formatları işleyecektir, ancak aşağıdakiler de dahil olmak üzere ABD formatlarını idare etmelidir:

  • 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

Mevcut girişimimle cevaplayacağım, ama birisinin daha iyi ve / veya daha zarif bir şey olmasını umuyorum.


3
BTW, hangi dili kullandığınızı belirtmelisiniz. Tüm regex motorları aynı sözdizimine sahip değildir.
AndrewJFord

9
Her ne kadar cevap bu davayı kapsa da, sadece 1 yerine +1 seçeneğini bırakmışsınız gibi görünüyor.
Eric

153
ABD'deki tüm telefon numaraları 555, bunlardan ayrı olarak gerektirmez 911mi?
Andrew Grimm

41
Aksine, 555 öneki sahte telefon numaraları için ayrılmıştır. Bu numaraların gerçek bir telefon numarasına bağlanmamaları garanti edilir, böylece bir izleyicinin numarayı aramaya çalışmamasını ve bazı fakir masumları taciz etmesini sağlamak için televizyon ve filmlerde sıklıkla kullanılırlar.
rushinge

49
@rushinge Bu onlarca yıl önce doğruyken, artık doğru değil . 555 öneki hala özeldir, ancak 555-0100 - 555-0199 bağlantısı olmadan yalnızca küçük bir sayı aralığının sona ereceği garanti edilir. Ama eminim Andrew yine de şaka yapıyor.
Adam Davis

Yanıtlar:


515

Daha iyi bir seçenek ... İngilizcenin +44 (0) ...uluslararası öneki kullanması istendiğinde standart olmayan forma sayı yazma eğilimi nedeniyle dikkat ederek, girişteki rakam olmayan tüm karakterleri ('x' ve önde gelen '+' işaretleri hariç) soyun (bu özel durumda, (0)tamamen atmanız gerekir ).

Ardından, aşağıdaki gibi değerler elde edersiniz:

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

Sonra görüntülediğinizde, kalplerinizin içeriğini yeniden biçimlendirin. Örneğin

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

35
Sayıların ABD dışından gelmesine izin verilirse biçimlendirme kodu zaman kaybı olacaktır.
Daniel Earwicker

26
Bu iyi ve hepsi, ama girilen aslında bir telefon numarası olduğunu doğrulamaz. Örneğin, kullanıcı gerekli 10 rakamı girmezse ne olur? Bu, iyi normal ifade doğrulamasıyla birleştirilmelidir.
Hugh Jeffner

108
Sorunun doğrulama ile ilgili olduğunu düşünmek - bu gerçekten çok kötü bir cevap.
PlexQ

15
@PlexQ Katılıyorum. Asıl sorun, tüm olası biçimlendirme seçeneklerini işlemeye çalıştığı için telefon numarası doğrulamasını işlemeye çalışmaktır. Tüm bunları çözmeye çalışmak yerine, girdiyi alın ve sadece "sayıya" sahip olana kadar tüm biçimlendirme tüylerinin "ön şeridini" yapın. Bunu yapmak 2 sorunu çözer - sonucu test etmek artık kolaydır ve artık görüntüleme için geri döndürülen değerlerin tutarlı bir şekilde biçimlendirilmesini sağlayabilirsiniz. "Complicator's Gloves" hakkındaki bu cevaba ilişkin ilk yorum iyi bir okuma ... bazen bir sorunun cevabı ona farklı yaklaşmaktır.
scunliffe

29
Bu kadar yüksek oy alan bir cevap nasıl? Bu hiçbir şeyi doğrulamaz . Daha da kötüsü, diğer tüm telefon numarası doğrulama soruları bu bir referans ...
jlars62

303

Bunun, en azından Kuzey Amerika için, NANP adı verilen bir spesifikasyonun olduğu ortaya çıkıyor .

Tam olarak ne istediğinizi belirtmeniz gerekir. Yasal sınırlayıcılar nelerdir? Boşluk, çizgi ve nokta? Sınırlayıcıya izin verilmiyor mu? Bir sınırlayıcıları karıştırabilir (örneğin, + 0.111-222.3333)? Uzantılar (ör. 111-222-3333 x 44444) nasıl ele alınacak? 911 gibi özel sayılardan ne haber? Alan kodu isteğe bağlı mı yoksa zorunlu mu olacak?

İşte 7 veya 10 haneli bir sayı için uzantılara izin verilen bir regex, sınırlayıcılar boşluklar, tire işaretleri veya noktalardır:

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

7
burada uzantı bölümü olmadan (Kullanıcılarımın ayrı bir alana ext girmesini sağlarım): ^ (?: (?: \ +? 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
İşte sadece 10 haneli telefon numaralarıyla eşleşen bir sürüm (843-1212 gibi 7 haneli değil): /(?:(?:\+?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 basamaklı alan kodu çevresinde () kabul edilir ve ülke kodu olarak 1'den önce izin verilmez(?:(?:(\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 Son iki yıldır Jeffrey Friedl'in kitabını yanımda masamda tuttum, çünkü düzenli ifadeler işimin önemli bir parçası. Düzenli ifadeleri gerçekten anlamak iyi bir zaman alır. Bazen, bu sitenin okuyucuları, özellikle telefon numarası gösterimleri gibi çok sayıda köşe vakası olan alanlarda kendi yazılarını yazmaktan ziyade mevcut bir çözümü arıyorlar.
Justin R.Mar

7
@ fatcat1111 Bunu anlıyorum, ancak buradaki yanıtların çoğu "ben de" tip köşe ifadelerinize uymayan bir kerelik düzenli ifadelerdir. Bunlar daha sonra kullanmaya çalıştığım tüm web sitelerine giriyor ve birisi yarı pişmiş normal ifade kullandığından posta kodumu veya telefon numaramı veya e-posta adresimi giremiyorum (örneğin: +, e-posta adreslerinde geçerli bir karakterdir) ). Bu sayfadaki en iyi yanıtlar kullanıcıları peçete çizimli normal ifadelere değil, kütüphanelere yönlendirir.
Steven Soroka

298
.*

Kullanıcılar size telefon numaralarını vermek istiyorlarsa, doğru olmaları için onlara güvenin. Size vermek istemiyorlarsa, geçerli bir sayı girmeye zorlamak ya onları bir rakibin sitesine gönderir ya da regex'inize uyan rastgele bir dize girmelerini sağlar. Hatta premium tarifeli bir burç yardım hattının numarasını aramak ve bunun yerine girmek cazip olabilirim.

Ayrıca, aşağıdakilerden herhangi birini bir web sitesinde geçerli girişler olarak değerlendiririm:

"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"

202
Buradaki düşünceye katılıyorum, ancak bazen telefon numarası kullanıcının yararına önemli bir şey için kullanılacaksa doğrulama yapmak güzel . Burada en iyi örnek, satın alma işlemi için kredi kartı yetkilendirmesidir. Telefon numarası yanlışsa, kimlik doğrulama başarısız olabilir.
Sivri

53
Kullanıcı telefon numarasını girmek istemiyorsa, yalnızca alanın isteğe bağlı olmasına izin verebilirsiniz, ancak kullanıcıdan girecekse geçerli bir telefon numarası girmesini istemek çok mu fazladır?
Joel McBeth

11
Ayrıca bir doğrulama rolü, insanlara, aksi halde eklemeyi hatırlayamayacakları ancak gerçekte tahmin edilemeyecek alan kodları vb. Eklemelerini hatırlatmaktır.
Ben McIntyre

29
@Pointy Ancak normal ifade doğrulaması size yardımcı olmaz. Telefon numarasının doğru olup olmadığını doğrulamanın tek ve tek yolu, ona bir mesaj göndermek (mobil durumunda) VE kullanıcının bir tür doğrulama kodu kullanarak onayladığından emin olmaktır. Sayı doğruluğu önemli olduğunda yaptığınız şey budur. Diğer her şey, kullanıcının bazı (ama hepsi değil) bazı yazım hatalarına karşı koruma kolaylığı ve hiçbir şeyi doğrulamaz.
Alex B

14
Güzel. Telefon numaram 1 'VEYA 1 = 1 - PWNED . Bkz. Xkcd.com/327 ve owasp.org/index.php/Testing_for_SQL_Injection_(OWASP-DV-005)
Aaron Newton

171

Ayrıca " libphonenumber " Google Kütüphanesine bakmanızı öneririm . Normal ifade olmadığını biliyorum ama tam olarak ne istiyorsan onu yapıyor.

Örneğin, aşağıdakileri tanıyacaktır:

15555555555

olası bir sayıdır, ancak geçerli bir sayı değildir. ABD dışındaki ülkeleri de destekler.

Fonksiyonellik özellikleri:

  • Dünyanın tüm ülkeleri / bölgeleri için telefon numaralarını ayrıştırma / biçimlendirme / doğrulama.
  • getNumberType- sayının türünü sayının kendisine göre alır; Sabit hat, Mobil, Ücretsiz, Premium Ücret, Paylaşılan Maliyet, VoIP ve Kişisel Numaraları (mümkün olduğunda) ayırt edebilir.
  • isNumberMatch - iki sayının aynı olup olmayacağına dair güven düzeyi kazanır.
  • getExampleNumber/ getExampleNumberByType- tüm ülke / bölgeler için geçerli örnek numaraları sağlar ve hangi tür telefon numarasına ihtiyaç duyulacağını belirleme seçeneği sunar.
  • isPossibleNumber - sadece uzunluk bilgisini kullanarak, tam bir doğrulamadan çok daha hızlı bir sayının olası bir telefon numarası olup olmadığını hızla tahmin etme.
  • isValidNumber - uzunluk ve önek bilgisini kullanarak bir bölge için telefon numarasının tam olarak doğrulanması.
  • AsYouTypeFormatter - kullanıcılar her rakamı girdiğinde telefon numaralarını anında biçimlendirir.
  • findNumbers - metin girişindeki sayıları bulur.
  • PhoneNumberOfflineGeocoder - bir telefon numarasıyla ilgili coğrafi bilgiler sağlar.

Örnekler

Telefon numarası doğrulamasında en büyük sorun, kültürel olarak çok bağımlı olmasıdır.

  • Amerika
    • (408) 974–2042Bir olan geçerli ABD numarası
    • (999) 974–2042olan bir geçerli değil ABD numarası
  • Avustralya
    • 0404 999 999Bir olan geçerli Avustralya sayı
    • (02) 9999 9999aynı zamanda geçerli bir Avustralya numarasıdır
    • (09) 9999 9999olan bir geçerli değil Avustralyalı sayı

Normal bir ifade, bir telefon numarasının biçimini kontrol etmek için iyidir, ancak bir telefon numarasının geçerliliğini gerçekten kontrol edemez .

Telefon numaranızı test etmek için basit bir normal ifadeyi atlamanızı ve Google gibi bir kütüphaneyi libphonenumber(GitHub projesine bağlantı) kullanmanızı öneririm .

Libphonenumber ile tanışın!

Daha karmaşık örneklerinizden birini kullanarak şu verileri1-234-567-8901 x1234 elde edersiniz (çevrimiçi demoya bağlantı) :libphonenumber

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

Yani sadece telefon numarasının geçerli olup olmadığını öğrenmekle kalmaz (aynı zamanda), aynı zamanda yerel ayarınızda tutarlı telefon numarası biçimlendirmesi elde edersiniz.

Bonus olarak, libphonenumbertelefon numaralarının geçerliliğini kontrol etmek için bir dizi veri seti vardır, bu nedenle +61299999999(uluslararası sürümü (02) 9999 9999) gibi bir sayıyı kontrol etmek, biçimlendirmeyle geçerli bir sayı olarak döner:

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 ayrıca telefon numarasının olduğu tespit edilen konumu kapmak ve saat dilimi bilgilerini telefon numarasından almak gibi birçok ek avantaj sağlar:

PhoneNumberOfflineGeocoder Results
Location        Australia

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

Ancak geçersiz Avustralya telefon numarası ( (09) 9999 9999) geçerli bir telefon numarası olmadığını döndürür.

Validation Results

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

Google'ın sürümünde Java ve Javascript kodu vardır, ancak kullanıcılar Google i18n telefon numarası veri kümesini kullanan diğer diller için de kitaplıklar uygulamıştır:

Her zaman bir yerel ayardan sayı kabul edeceğinizden ve her zaman tek bir formatta olacağından emin olmadığınız sürece, bunun için kendi kodunuzu yazmamanızı ve telefon numaralarını doğrulamak ve görüntülemek için libphonenumber kullanmanızı öneririm.


Şimdi Go bağlantı noktasının da bulunduğunu belirterek: github.com/ttacon/libphonenumber
michaelhanson

Olası bir sayı olup olmadığını kontrol ederken bir ülke kodu belirtmeniz gerekmez mi? PHP sürümünü kullanıyorum ve (gibi 0'ın gerçek sayılarla değiştirin) gibi bir İngiliz numarası 07700000000girerseniz Missing or invalid default region.hata alıyorum. Ama ülke kodunu belirtirsem geçecek.
BugHunterUK

Bilginize: Bu kütüphane bazı ülkeleri desteklemiyor, phpinterviewquestions.co.in/blog/ionic/…
sijo vijayan

1
@BugHunterUK (ve bu soruya rastlayan ve aynı şeyi merak eden herkes) bir sayıyı ayrıştırırken, beklenen bölgeyi belirtebilirsiniz ve kütüphane bu bölgedeki uluslararası olmayan sayıları arayacaktır. Belirtmezseniz, geçerli bir uluslararası biçimde olmayan herhangi bir şeyi reddeder.
18'de IMSoP

Düşünün github.com/nyaruka/phonenumbers Google'da yerine libphonenumber tarafından önerilen "resmi" Git paket haline gelmiştir olarak.
DeeZone

78

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

Bu eşleşmeler:

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

N $ 'a tasarruf sağlar:

  1. Ülke göstergesi
  2. Telefon numarası
  3. Uzantı

Bunu https://www.regexpal.com/?fam=99127 adresinde test edebilirsiniz.


Bu gördüğüm en kapsamlı regex'ti. Çıkarıncaya kadar dolaşmak kolaydır ^ve $ya da [111] [111] [1111]ya 111--111--1111da benzerlerini kullanarak etrafta dolaşabilirim. (üzgünüm, son
yorumumu sildim

Lütfen yeniden ifade edebilir misiniz? Bunu anlayamıyorum: "Siz ^ ve $ 'ı kaldırana kadar etrafta dolaşmak kolaydır, yoksa [111] [111] [1111] kullanarak etrafta dolaşabilirim". O doğrular anlamına mı geliyor '[111] [111] [1111]' sen alırken ^ve $?
Ismael Miguel

Ben senin regex kullanarak etrafında var [111] [111] [1111]ve 111--111--1111ben kaldırıldı kadar ^ve $regex gelen.
bafromca

11
^ ^ ^ Bu, yorum dizilerinin neden sohbet ETMEMESİNİN harika bir örneğidir. Bu konuşmanın nasıl ortaya çıktığıyla çok ilgileniyorum ve bu ReGex uygulamamda kullanmak için yeterince sağlam olup olmadığını bilmeliyim. Ne yazık ki, sohbet konuşması artık bitti.
Matt Cashatt

1
Dürüst olmak gerekirse, sohbet etmedim. Birden fazla kez açıklama için sorduktan sonra ben hiçbir bilgi kaldı. Çevrimiçi ortamda bulduğunuz her türlü sayıyla birden çok biçimde kendiniz deneyebilirsiniz. Bu bir ile denedim bir şey birden fazla telefon numarası kullanmaktır, ama etrafında boşluk varsa iyi çalışmaz. Ve basamak sayısını saymak ve belirli bir miktarı uygulamak için bir çözüm bulmak zorundayım.
Ismael Miguel

63

Tüm beyaz alanları soymanın cevabı düzgün olsa da, ortaya çıkan problemi gerçekten çözmez, bu da bir normal ifade bulmaktır. Örneğin, bir web sayfasını indiren ve normal ifadeyi kullanarak tüm telefon numaralarını çıkaran test komut dosyamı ele alalım. Yine de bir normal ifadeye ihtiyacınız olacağı için, normal ifadeyi de tüm işi yapmanız gerekebilir. Ben bununla geldim:

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

İşte bunu test etmek için bir perl betiği. Eşleştiğinizde, $ 1 alan kodunu, $ 2 ve $ 3 telefon numarasını ve 5 $ uzantıyı içerir. Test komut dosyam internetten bir dosya indiriyor ve içindeki tüm telefon numaralarını yazdırıyor.

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

Düzenle:

Biraz sıkılaştırmak için normal ifadedeki \ W * \ s * \ W? \ S * olarak değiştirebilirsiniz. Normal ifadeyi yazarken bir formdaki kullanıcı girişini doğrulamak açısından düşünmüyordum, ancak bu değişiklik normal ifadeyi bu amaçla kullanmayı mümkün kılıyor.

'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*))?';

2
Regex FYI da eşleşir: (4570457-6789bu oldukça yaygın bir yazım hatası olacaktır. Maç grupları da çarpışıyor
SooDesuNe

@SooDesuNe Hazırlamak (^|[^\d\n])(çok satırlı bayrak açıkken), hemen önce sayısal bir şey olmamasını sağlayarak genel sorunu önler.
btown

Bu Kuzey Amerika merkezli olduğunu unutmayın - "44 7911 123456" özlüyor
Ben Wheeler

43

Bu soruyu başka bir SO sorusuna da cevabımı bu konuya bir cevap olarak dahil etmeye karar vermeden önce cevapladım, çünkü hiç kimse öğelere nasıl ihtiyaç duyulacağını / gerektirmeyeceğini ele alıyordu, sadece normal ifadeleri dağıttı: Regex yanlış çalışıyor, beklenmedik şeylerle eşleşiyor

Bu sitedeki yazımdan, çok kısıtlayıcı olursanız, (diğer sitede yaptığım gibi) uyaracağım kendi istediğiniz telefon numarası biçimi için kendi regex'lerini yapmalarına yardımcı olmak için hızlı bir rehber oluşturdum. İstediğiniz sonuçları elde edemeyebilirsiniz ve dünyadaki tüm olası telefon numaralarını kabul etmek için "tek beden herkese uyar" çözümü yoktur - yalnızca seçim biçiminiz olarak kabul etmeye karar verdiğiniz şey. Kendi sorumluluğunuzdadır kullanın.

Hızlı kopya kağıdı

  • İfadeyi başlatın: /^
  • Bir alana gereksinim duymak istiyorsanız, şunu kullanın: [\s] veya\s
  • Parantez istiyorsanız,: [(]ve tuşlarını kullanın [)]. kullanma\( ve \)çirkin ve işler kafa karıştırıcı yapabilirsiniz.
  • Herhangi bir şeyin isteğe bağlı olmasını istiyorsanız, ? ondan sonra
  • Kısa çizgi istiyorsanız, -veya yazın [-]. Bununla birlikte, onu bir dizi başka karakterde ilk veya son olarak koymazsanız, bundan kaçmanız gerekebilir: \-
  • Bir yuvadaki farklı seçenekleri kabul etmek istiyorsanız, seçeneklerin etrafına köşeli ayraç koyun: [-.\s]tire, nokta veya boşluk gerektirir. Son braketten sonraki soru işareti, bu yuva için isteğe bağlı olanların tümünü yapar.
  • \d{3}: 3 basamaklı bir sayı gerektirir: 000-999. İçin kestirme [0-9][0-9][0-9].
  • [2-9] : Bu yuva için 2-9 arası bir basamak gerektirir.
  • (\+|1\s)? : Bir "artı" veya bir 1 ile bir boşluk (dikey çizgi karakteri, | "veya") ve isteğe bağlı yapın. "Artı" işaretinden kaçılmalıdır.
  • Belirli sayıların bir alanla eşleşmesini istiyorsanız, bunları girin: [246]2, 4 veya 6 [77|78]gerektirir. 77 veya 78 gerekir.
  • $/ : İfadeyi sonlandır

1
Bu çok yararlı, ama şüphe ve bir {min, max} ifade arıyorum. Yardım edebilir misin?
Ataboy Josef

Eğer bahsettiğimiz tek bir rakamsa (ve buna göre eşleşmesini sağlayabilirsiniz), [2-9]oraya koyduğum bloğa bakın . Bu, min'inizin 2 ve maks'inizin 9 olduğu anlamına gelir.
vapcguy

30

(Ben nokta gerek yoktu rağmen) basit yazdı.

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

Aşağıda belirtildiği gibi, yapısını / sırasını değil, yalnızca karakterleri kontrol eder


38
bu teknik olarak geçersiz olan tonlarca sayıyı doğrular. gibi, "- + () () ()) ())))". Ne yaptığınızı anlayabilmeniz için düzenli ifadeleri okumayı öğrenin.
Steven Soroka

3
@StevenSoroka teknik olarak çok sayıda geçersiz duruma izin verebilir, ancak sadece mümkün olan en basit çözümle ortak hatalardan kaçınmak için kullanıcıya yardım etmeyi düşündüğümüzde, bu gitmek için bir yol :)
happyhardik

2
Bu aynı zamanda boşluk, boş çizgi eşleşen
Wasim A.

1
@HappyHardik. Aslında. Basit ve güçlü, temel doğrulama için kullanıcının birden fazla nokta, tire, parantez veya artı yazmasına izin verin.
dijipiji

Sadece kullandım ve birçok yönden yanlış. Örneğin, bir İngiltere telefon numarası +44 ile başlayabilir veya bir telefon numarasının içinde (0) olabilir. Ancak bu, normal ifadenize göre geçerli değildir. @Ismael Miguel'in cevabını tavsiye ederim. Çok iyi çalışıyor ve cevabınızı gözden geçirmenizi tavsiye ederim.
Stelios Voskos

22

Sadece alanda rastgele çöpünüzün olmadığını (yani form spam gönderenlerden) doğrulamak istiyorsanız, bu normal ifade güzel olmalıdır:

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

Kaç basamaklı olduğu veya bu basamaklarda hangi sayıların geçerli olduğu konusunda herhangi bir özel kurala sahip olmadığını, yalnızca rakamların, parantezin, tire işaretlerinin, artı, boşluk, pound, yıldız işareti, nokta, virgül veya harflerin doğrulandığını unutmayın. e, x,t mevcut bulunmaktadır.

Uluslararası numaralar ve yerelleştirme biçimleriyle uyumlu olmalıdır. Bazı bölgeler için köşeli, kıvrımlı veya açılı köşeli parantezlere izin vermeyi öngörüyor musunuz? (şu anda dahil edilmemiştir).

Rakam başına kuralları korumak istiyorsanız (ABD Alan Kodları ve Öneklerinde (değişim kodları gibi) 200-999 aralığında olmalıdır), size iyi şanslar. Dünyanın herhangi bir ülkesi tarafından gelecekte herhangi bir zamanda modası geçmiş olabilecek karmaşık bir kural setini korumak eğlenceli görünmüyor.

Sayısal olmayan karakterlerin tümünü / çoğunu sıyırmak sunucu tarafında iyi sonuç verebilir (özellikle bu değerleri bir çeviriciye aktarmayı planlıyorsanız), doğrulama sırasında kullanıcının girişini atmak istemeyebilirsiniz, özellikle de başka bir alanda düzeltmeler yapabilir.


22

Soyma işleminin () karakterlerinin, yaygın +44 (0) 1234 567890olan İngiltere numaralarını yazma stili için çalışmadığını : bu, uluslararası numarayı çevirme anlamına gelir:
+441234567890
veya İngiltere aramada01234567890


15

RegExLib'e bir göz attınız mı? mı?

ABD telefon numarasını girmek, olasılıkların bir listesini geri getirdi.


3
Bu, belirsiz hataları kodunuza entegre etmenin harika bir yolu gibi görünüyor.
Tom Lord

12

Kısıtlamasız bir regex girişimim:

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

Kabul eder:

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

Reddetti:

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

Sergilemek için sterilize etmek size kalmış. Doğruladıktan sonra bir sayı olabilir .


12

Bunu oldukça iyi buldum:

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

Bu sayı biçimleri için çalışı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

Emin olmak için global VE çok satırlı bayrakları kullandığınızdan emin olun.

Bağlantı: http://www.regexr.com/3bp4b


11

Form doğrulaması hakkında konuşuyorsanız, değişen ülke ve sağlayıcı standartları nedeniyle doğru anlamı ve doğru verileri doğrulamak için normal ifade son derece karmaşık olacaktır. Ayrıca güncel tutmak zor olacaktır.

Soruyu, dahili olarak tutarlı olmayan, örneğin geçerli bir sayı kümesine sahip olan, ancak ana hat, değişim vb. Ülke kodu öneki için geçerli kalıpla doğrulamadığından, geniş ölçüde geçerli bir kalıp ararken yorumluyorum. .

Kuzey Amerika açıktır ve uluslararası için insanların sayılarını belirleme ve hatırlama yollarını kapsayan 'deyimsel' bir desen kullanmayı tercih ederim:

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

Kuzey Amerika modeli, bir parantez dahil edildiğinde her ikisinin de bulunduğundan emin olur. Uluslararası isteğe bağlı başlangıç ​​'+' ve ülke kodunu açıklar. Ondan sonra, deyimdesin. Geçerli eşleşmeler şöyle olur:

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

Deneyimim Kuzey Amerika, Avrupa ve küçük Asya ile sınırlı olduğu için bu önyargılı olabilir.


Javascript doğrulama komut dosyasında yukarıdaki uygulamaya çalışıyorum ama bir invalid quantifierhata alıyorum. Neyi yanlış yaptığım hakkında bir fikrin var mı?
Jannis

Telefonun semboller olmadan belirtildiği önemsiz davayı ekleyebilirim, ancak belki boşluklar ve ülke kodu, Avrupa'da yerel ve mobil numaralar için tipiktir: 676412342, 676 46 32 12, 676 463 212
rupps

11

İşte başarmam gereken doğrulamayla en iyi eşleşen harika bir model. Orijinal yazar değilim, ancak bu sorunun çok karmaşık olduğunu ve özlü veya yaygın olarak yararlı bir cevap olmadan bulduğum için paylaşmaya değer olduğunu düşünüyorum.

Aşağıdaki normal ifade, çeşitli küresel telefon numarası biçimlerinde yaygın olarak kullanılan sayı ve karakter birleşimlerini yakalayacaktır:

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

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

Olumsuz:
926 3
48800600-APPLE

Orijinal kaynak: http://www.regexr.com/38pvb


Bunun uzantılar için sınırlı bir desteği vardır. "616-555-1234 x567" ile eşleşir, ancak "616-555-1234 dahili 567" ile eşleşmez.
Jon Schneider

2
Örneğin "------- (((((((55555555" veya "99999999999999999999999") için yanlış pozitif
mikep

+31 76 596 4192 numaralı Nitherland macdonalds'ı doğrulamıyor (sadece rastgele sayılar için test yapıyordum)
BIOHAZARD

10

Bağırsak hissim, bu konuya verilen cevapların miktarı ile güçlendirildi - bu soruna neredeyse sonsuz sayıda çözüm var, bunların hiçbiri zarif olmayacak.

Dürüst olmak gerekirse, telefon numaralarını doğrulamaya çalışmamanızı tavsiye ederim. Tüm farklı yasal formatlara izin verecek büyük, kıllı bir doğrulayıcı yazabilseniz bile, ilk etapta bir telefon numarasına uzaktan benzeyen hemen hemen her şeye izin verirdi.

Benim düşünceme göre, en zarif çözüm minimum uzunluğu doğrulamaktır, başka bir şey değildir.


Bunların bir kısmını denedikten ve mevcut verilerden ve kullanıcılardan gelen geri bildirimlerden geçtikten sonra katılıyorum ...
Christopher King

Bazen de doğrulama yapmalısınız. Onay kodları gönderiyorsam, spam göndericisinin alana girdiği rastgele çöplere kod gönderemiyorum. Kaynak mesajlarını boşa harcamadan önce numaranın muhtemelen bir telefon numarası olduğundan emin olmak istiyorum .
Luke

10

Bu Filipin Cep Telefonu Numaraları için basit bir Düzenli İfade desen:

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

veya

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

bunlarla eşleşecek:

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

Birincisi HERHANGİ iki haneli ülke koduyla, ikincisi ise sadece Filipin ülke koduyla eşleşecektir.

Burada test edin: http://refiddle.com/1ox


Teşekkürler. 028231234 gibi alan kodlu sabit hat numaralarına ne dersiniz? Alan kodları sadece 2-3 haneli sayı olup olmadığını merak ediyorum ve her zaman önce 0 mı?
stormwild

9

İşte şimdiye kadarki en iyi denemem. Yukarıdaki biçimleri işliyor ancak eminim başka olası biçimleri de kaçırıyorum.

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

9

Tek / basit regex ile uluslararası sayılarla uğraşmakta zorlanacaksınız, bu gönderiye bakın zorlanacaksınız, uluslararası (ve hatta kuzey amerika) telefon numaralarının zorlukları hakkındaki .

Ülke kodunun ne olduğunu belirlemek için ilk birkaç basamağı ayrıştırmak, ardından ülkeye göre farklı işlem yapmak isteyeceksiniz.

Bunun ötesinde - verdiğiniz liste başka bir ortak ABD formatı içermiyor - ilk 1'i bırakıyor. ABD'deki çoğu cep telefonu buna gerek duymuyor ve uluslararası arama yapmadığı sürece genç nesli şaşırtmaya başlayacak.

Bunun zor bir sorun olduğunu doğru bir şekilde belirlediniz ...

-Adam


Sunulan bir çözüm değil. BU MÜMKÜN. Zor ya da karmaşık olması kollarınızı kaldırmanız gerektiği anlamına gelmez.
Eric Hodonsky

7

Bu cevapları okuduktan sonra, bir grup metni inceleyebilen ve telefon numaralarını herhangi bir formatta (artı işaretli ve işaretsiz uluslararası olanlar dahil) çıkarabilen basit bir düzenli ifade yoktu.

Son zamanlarda bir istemci projesi için kullandığım şey, burada tüm telefon numaralarını herhangi bir formatta tel: bağlantılarına dönüştürmek zorunda kaldık.

Şimdiye kadar, atıldıkları her şeyle çalışıyor, ancak hatalar ortaya çıkarsa, bu yanıtı güncelleyeceğim.

regex:

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

Tüm telefon numaralarını tel: bağlantıları ile değiştirmek için PHP işlevi (herhangi birinin merak etmesi durumunda):

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

Bu düzenli ifade eşleşti +1 1234562222222222222222222222.
Varda Elentári

neden sadece geri dönmüyorsun?
thexande

"99999999999999999999999999999999999999999" için yanlış pozitif
Ben Wheeler

6

İnanıyorum Numarası :: Telefon :: ABD ve Normal İfade :: Common (özellikle kaynağını Normal İfade :: Common :: URI :: RFC2806 ) Perl modülleri yardımcı olabilir.

Soru, sayıları doğrulama amacını açıklamak için muhtemelen biraz daha ayrıntılı olarak belirtilmelidir. Örneğin, 911 ABD'de geçerli bir sayıdır, ancak 911x x'in herhangi bir değeri için değildir. Böylece telefon şirketi aramayı bitirdiğinizde hesaplayabilir. Bu konuda çeşitli varyasyonlar var. Ancak normal ifadeniz alan kodu bölümünü kontrol etmez, bu yüzden endişe verici görünmüyor.

E-posta adreslerini doğrulama gibi, geçerli bir sonucunuz olsa bile, denemeden birisine atanıp atanmadığını bilemezsiniz.

Kullanıcı girişini doğrulamaya çalışıyorsanız, neden sonucu normalleştirmiyorsunuz ve onunla yapılmıyor? Kullanıcı geçerli bir sayı olarak tanıyamayacağınız bir numara girerse, girilen olarak kaydedin veya okunabilir karakterleri çıkarın. Numara :: Telefon :: Normale Perl modülü ilham kaynağı olabilir.


Burada bir uzuv çıkacağım ve bir telefon numarası olarak 911'e izin vermenin, bu normal ifadenin neredeyse tüm uygulamalarında muhtemelen kötü bir fikir olduğunu söyleyeceğim. Gerçi iyi yakalamak.
Nicholas Flynt

4

Bir pazar araştırma şirketi için çalışıyorum ve bu tür girdileri her zaman filtrelemeliyiz. Çok karmaşık hale getiriyorsun. Alfasayısal olmayan karakterleri sıyırın ve bir uzantı olup olmadığına bakın.

Daha fazla analiz için, geçerli numaralardan oluşan bir veritabanına erişmenizi sağlayacak ve aynı zamanda sabit hatlar mı yoksa cep telefonları mı, bağlantısı kesilmiş mi, vb. Olup olmadığını söyleyecek birçok sağlayıcıdan birine abone olabilirsiniz.


Doğrulama? 123% $) *% () $ * () # 456 * () * $ # (* (# 8908 # önerilen çözümünüzle eşleşecektir.)
PlexQ

1
@PlexQ 555-123-1234, 07777777777, 90210, 01/01/1901 - kullanıcılar doğrulama yoluyla çöpleri sıkıştırmak için yaratıcıdır. Aşırı kısıtlayıcı validasyon kullanarak ve yanlış olduklarını söyleyerek gerçekten garip verilere sahip olanları ticarileştirmemek daha iyidir.
ReactiveRaven

4

Karakterleri biçimlendirmek için bir değişiklik yapın, ardından kalan telefonun geçerliliğini kontrol edin. PHP'de,

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

Bunun gibi karmaşık bir normal ifadeyi kırmak da aynı derecede etkili olabilir, ancak çok daha basit olabilir.


3

Bunu ilginç bir şey olarak buldum. Test etmedim ama işe yarayacak gibi görünüyor

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

4
Mesajınız bu kodu yazmadığınızı gösteriyor. Bir kaynak belirtmek ister misiniz lütfen?
Alastair Irvine


3

Bunun için bir Maskeli Giriş kullanmaktan daha iyi olur. Bu şekilde kullanıcılar YALNIZCA sayı girebilir ve uygun gördüğünüz şekilde biçimlendirebilirsiniz. Bunun bir web uygulaması için olup olmadığından emin değilim, ancak varsa bunu yapmak için bazı seçenekler sunan bir çok tıklama jQuery eklentisi var.

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

Hatta öğreticilerinde telefon numarası girişlerini nasıl maskeleyeceklerini de ele alıyorlar.


3

İşte JavaScript'te iyi çalışan bir tane. Bir dizedir çünkü Dojo widget'ının beklediği buydu.

İsteğe bağlı uzantısı olan 10 haneli Kuzey Amerika NANP numarasıyla eşleşir. Boşluklar, tire ve dönemler sınırlayıcı olarak kabul edilir.

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

3

Aynı sorunla mücadele ediyordum, başvurumu gelecekteki kanıtlar yapmaya çalışıyordum, ama bu adamlar beni doğru yöne götürdüler. Aslında çalışıp çalışmadığını görmek için sayının kendisini kontrol etmiyorum, sadece bir uzantıya sahip olan veya olmayan bir sayı dizisinin girildiğinden emin olmaya çalışıyorum.

En kötü durum senaryosu, kullanıcı XML dosyasından biçimlendirilmemiş bir sayı almak zorunda kalsaydı, yine de sayıları telefonun sayısal alanına yazacaktı 012345678x5, güzel tutmak için gerçek bir neden yoktu. Bu tür RegEx benim için böyle bir şey çıkardı:

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

2

Benim eğilimim, rakam olmayanları soymanın ve sadece en iyi olanı kabul etmenin kabul edilmesi. Belki de, örneğin alfabetik bir telefon numarası "ASK-JAKE" gibi bir şeyi yasaklamasına rağmen, en az birkaç basamak bulunduğundan emin olmak için.

Birkaç basit perl ifadesi şunlar olabilir:

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

Biçimlendirme ipuçları verebilecek rakam gruplarını bir arada tutmak için ilkini kullanın. İkincisini tüm basamak olmayan sayıları atmak için kullanın.

Bir duraklama ve ardından daha fazla anahtar girilmesi gerekebileceğinden endişe duyuyor musunuz? Veya 555-1212 gibi bir şey (bip sesini bekleyin) 123?


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

Bir rakamla bitmeli, (veya + veya bir rakamla başlayabilir ve + - (veya) içerebilir


2

İrlanda cep telefonu numaralarına benzer bir şey yapmak isteyen herkes için, bunu yapmanın basit bir yolu:

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

Bu bağlantıda bir JQuery çözümü de var.

DÜZENLE:

jQuery çözümü:

    $(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();
});


});

Kaynak .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.