Cách xác thực số điện thoại bằng regex


920

Tôi đang cố gắng kết hợp một regex toàn diện để xác thực số điện thoại. Lý tưởng nhất là nó sẽ xử lý các định dạng quốc tế, nhưng nó phải xử lý các định dạng của Hoa Kỳ, bao gồm các định dạng sau:

  • 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

Tôi sẽ trả lời với nỗ lực hiện tại của mình, nhưng tôi hy vọng ai đó có thứ gì đó tốt hơn và / hoặc thanh lịch hơn.


3
BTW, bạn nên chỉ định ngôn ngữ bạn đang sử dụng. Không phải tất cả các công cụ regex có cùng một cú pháp.
AndrewJFord

9
Có vẻ như bạn đã bỏ qua tùy chọn +1 thay vì chỉ 1 mặc dù câu trả lời bao gồm trường hợp này.
Eric

153
Không phải tất cả các số điện thoại Hoa Kỳ yêu cầu 555họ ngoài 911?
Andrew Grimm

41
Ngược lại, tiền tố 555 được dành riêng cho các số điện thoại giả. Những số này được đảm bảo không kết nối với một số điện thoại thực tế, vì vậy chúng thường được sử dụng trong truyền hình và phim ảnh để đảm bảo rằng người xem không cố gọi số đó và cuối cùng quấy rối một số người vô tội.
vội vàng

49
@rushinge Mặc dù điều đó đã đúng trong nhiều thập kỷ trước nhưng nó không còn đúng nữa . Tiền tố 555 vẫn đặc biệt, nhưng chỉ một phạm vi số nhỏ được đảm bảo chấm dứt mà không cần kết nối từ 555-0100 đến 555-0199. Nhưng tôi khá chắc chắn rằng Andrew đã nói đùa.
Adam Davis

Câu trả lời:


515

Tùy chọn tốt hơn ... chỉ loại bỏ tất cả các ký tự không có chữ số trên đầu vào (ngoại trừ dấu 'x' và dấu '+' hàng đầu), chú ý vì xu hướng của Anh là viết số ở dạng không chuẩn +44 (0) ...khi được yêu cầu sử dụng tiền tố quốc tế (trong trường hợp cụ thể đó, bạn nên loại bỏ (0)hoàn toàn).

Sau đó, bạn kết thúc với các giá trị như:

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

Sau đó, khi bạn hiển thị, định dạng lại nội dung trái tim của bạn. ví dụ

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

35
Mã định dạng sẽ lãng phí thời gian nếu các số được phép đến từ bên ngoài Hoa Kỳ.
Daniel Earwicker

26
Điều này là tốt và tất cả, nhưng nó không xác nhận những gì được nhập thực sự là một số điện thoại. Ví dụ: nếu người dùng không nhập 10 chữ số cần thiết thì sao? Điều này nên được kết hợp với xác nhận regex tốt.
Hugh Jeffner

108
Xem xét câu hỏi là về xác nhận - đây là một câu trả lời thực sự thực sự xấu.
PlexQ

15
@PlexQ Tôi không đồng ý. Vấn đề ban đầu là cố gắng xử lý xác thực số điện thoại vì nó đang cố xử lý tất cả các tùy chọn định dạng có thể. Thay vì cố gắng giải quyết tất cả những điều đó, hãy lấy đầu vào và "tách trước" tất cả các định dạng lông tơ cho đến khi bạn chỉ có "số". Làm điều này giải quyết được 2 vấn đề - việc kiểm tra kết quả giờ đây thật dễ dàng và giờ đây bạn có thể đảm bảo rằng các giá trị được hiển thị lại để hiển thị đều có thể được định dạng nhất quán. Nhận xét đầu tiên về câu trả lời này về "Găng tay của Complicator" là một bài đọc tốt ... đôi khi câu trả lời cho một vấn đề là tiếp cận nó theo cách khác.
scunliffe

29
Làm thế quái nào mà một câu trả lời được bình chọn cao như vậy? Điều này không xác nhận bất cứ điều gì. Điều tồi tệ hơn là tất cả các câu hỏi xác thực số điện thoại khác tham khảo câu hỏi này ...
jlars62

303

Nó chỉ ra rằng có một cái gì đó đặc tả cho điều này, ít nhất là đối với Bắc Mỹ, được gọi là NANP .

Bạn cần xác định chính xác những gì bạn muốn. Phân định pháp lý là gì? Dấu cách, dấu gạch ngang và dấu chấm? Không phân định được phép? Có thể trộn một dấu phân cách (ví dụ: + 0.111-222.3333) không? Các tiện ích mở rộng (ví dụ: 111-222-3333 x 44444) sẽ được xử lý như thế nào? Còn những con số đặc biệt, như 911 thì sao? Là mã vùng sẽ là tùy chọn hoặc bắt buộc?

Đây là biểu thức chính cho số gồm 7 hoặc 10 chữ số, với các tiện ích mở rộng được phép, dấu phân cách là dấu cách, dấu gạch ngang hoặc dấu chấ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})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

7
ở đây không có phần mở rộng (tôi làm cho người dùng của mình nhập ext vào một trường riêng): ^ (?: (?: \ +? 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
Đây là phiên bản chỉ khớp với số điện thoại 10 chữ số (không phải 7 chữ số như 843-1212): /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/
Brian Armstrong

8
10 chữ số chấp nhận () xung quanh mã vùng và không cho phép đặt trước 1 dưới dạng mã quốc gia(?:(?:(\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 Tôi đã có cuốn sách của Jeffrey Friedl bên cạnh tôi trên bàn trong hai năm qua, vì những biểu hiện thông thường là một phần chính trong công việc của tôi. Phải mất một thời gian tốt để thực sự hiểu các biểu thức thông thường. Đôi khi, các độc giả của trang web này chỉ đơn giản là tìm kiếm một giải pháp hiện có, thay vì tự viết, đặc biệt là trong các miền có nhiều trường hợp góc, chẳng hạn như biểu diễn số điện thoại.
Justin R.

7
@ fatcat1111 Tôi hiểu điều đó, nhưng phần lớn các câu trả lời ở đây là loại "tôi cũng vậy" của các biểu thức chính quy một lần có khả năng không phù hợp với bất kỳ trường hợp góc nào của bạn. Sau đó, chúng kết thúc trên tất cả các trang web tôi đang cố sử dụng và tôi không thể nhập mã zip hoặc số điện thoại hoặc địa chỉ email của mình vì ai đó đã sử dụng biểu thức chính quy nửa nướng (ví dụ: + là ký tự hợp lệ trong địa chỉ email ). Các phản hồi tốt nhất trên trang này hướng người dùng đến các thư viện, chứ không phải các biểu thức viết nguệch ngoạc.
Steven Soroka

298
.*

Nếu người dùng muốn cung cấp cho bạn số điện thoại của họ, thì hãy tin tưởng họ để làm cho đúng. Nếu họ không muốn đưa nó cho bạn thì buộc họ nhập số hợp lệ sẽ gửi chúng đến trang web của đối thủ cạnh tranh hoặc khiến họ nhập một chuỗi ngẫu nhiên phù hợp với biểu thức chính quy của bạn. Tôi thậm chí có thể bị cám dỗ để tìm kiếm số lượng của một đường dây nóng tử vi tỷ lệ phí bảo hiểm và thay vào đó.

Tôi cũng sẽ coi bất kỳ điều nào sau đây là các mục hợp lệ trên một trang 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"

202
Tôi đồng ý với tình cảm ở đây, nhưng đôi khi thật tuyệt khi thực hiện xác nhận khi số điện thoại thực sự sẽ được sử dụng cho mục đích quan trọng của người dùng . Ví dụ tốt nhất ở đây là ủy quyền thẻ tín dụng cho việc mua hàng. Nếu số điện thoại sai, auth có thể thất bại.
Pointy

53
Nếu người dùng không muốn nhập số điện thoại của mình, bạn chỉ có thể cho phép trường là tùy chọn, nhưng có nhiều yêu cầu người dùng nhập số điện thoại hợp lệ nếu họ sẽ nhập số không?
Joel McBeth

11
Ngoài ra, vai trò của xác nhận đơn giản là nhắc nhở mọi người thêm mã vùng, v.v. họ có thể không nhớ thêm, nhưng điều này không thể đoán được sau thực tế.
Ben McIntyre

29
@Pointy Nhưng xác nhận regex sẽ không giúp bạn. Cách duy nhất và duy nhất để xác thực nếu số điện thoại là chính xác là thực sự gửi tin nhắn đến nó (trong trường hợp di động) VÀ đảm bảo người dùng xác nhận bằng một số loại mã xác minh. Đây là những gì bạn làm khi độ chính xác số là quan trọng. Mọi thứ khác chỉ là để thuận tiện cho người dùng để bảo vệ chống lại một số lỗi chính tả (nhưng không phải tất cả) và không xác thực bất cứ điều gì.
Alex B

14
Mát mẻ. Số điện thoại của tôi là 1 'HOẶC 1 = 1 - PWNED . Xem xkcd.com/327owasp.org/index.php/Testing_for_Query_Injection_(OWASP-DV-005)
Aaron Newton

171

Tôi cũng sẽ đề nghị xem xét Thư viện Google " libphonenumber ". Tôi biết nó không phải là regex nhưng nó thực hiện chính xác những gì bạn muốn.

Ví dụ, nó sẽ nhận ra rằng:

15555555555

là một số có thể nhưng không phải là một số hợp lệ. Nó cũng hỗ trợ các quốc gia bên ngoài Hoa Kỳ.

Điểm nổi bật của chức năng:

  • Phân tích / định dạng / xác thực số điện thoại cho tất cả các quốc gia / khu vực trên thế giới.
  • getNumberType- lấy loại số dựa trên chính số đó; có thể phân biệt Đường dây cố định, Di động, Không thu phí, Tỷ lệ cao cấp, Chi phí chung, VoIP và Số cá nhân (bất cứ khi nào khả thi).
  • isNumberMatch - có được một mức độ tin cậy về việc hai số có thể giống nhau hay không.
  • getExampleNumber/ getExampleNumberByType- cung cấp số ví dụ hợp lệ cho tất cả các quốc gia / khu vực, với tùy chọn chỉ định loại số điện thoại mẫu nào là cần thiết.
  • isPossibleNumber - nhanh chóng đoán xem một số có phải là số điện thoại có thể hay không bằng cách chỉ sử dụng thông tin độ dài, nhanh hơn nhiều so với xác thực đầy đủ.
  • isValidNumber - xác nhận đầy đủ số điện thoại cho một vùng bằng thông tin độ dài và tiền tố.
  • AsYouTypeFormatter - định dạng số điện thoại khi đang di chuyển khi người dùng nhập từng chữ số.
  • findNumbers - tìm số trong nhập văn bản.
  • PhoneNumberOfflineGeocoder - cung cấp thông tin địa lý liên quan đến một số điện thoại.

Ví dụ

Vấn đề lớn nhất với xác nhận số điện thoại là nó phụ thuộc rất nhiều về văn hóa.

  • Mỹ
    • (408) 974–2042là số hợp lệ của Hoa Kỳ
    • (999) 974–2042không phải là một giá trị số Mỹ
  • Châu Úc
    • 0404 999 999là số hợp lệ của Úc
    • (02) 9999 9999cũng là số hợp lệ của Úc
    • (09) 9999 9999không phải là một giá trị số Úc

Một biểu thức thông thường là tốt để kiểm tra định dạng của một số điện thoại, nhưng nó không thực sự có thể kiểm tra tính hợp lệ của một số điện thoại.

Tôi sẽ đề nghị bỏ qua một biểu thức chính quy đơn giản để kiểm tra số điện thoại của bạn và sử dụng thư viện như của Google libphonenumber(liên kết đến dự án GitHub) .

Giới thiệu libphonenumber!

Sử dụng một trong những ví dụ phức tạp hơn của bạn 1-234-567-8901 x1234, bạn sẽ có được dữ liệu sau libphonenumber(liên kết đến bản demo trực tuyến) :

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

Vì vậy, bạn không chỉ tìm hiểu xem số điện thoại có hợp lệ không, mà còn có được định dạng số điện thoại nhất quán trong ngôn ngữ của bạn.

Như một phần thưởng, libphonenumbercũng có một số bộ dữ liệu để kiểm tra tính hợp lệ của các số điện thoại, do đó, kiểm tra một số như +61299999999(phiên bản quốc tế (02) 9999 9999) trả về dưới dạng số hợp lệ có định dạng:

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 cũng cung cấp cho bạn nhiều lợi ích bổ sung, chẳng hạn như lấy vị trí mà số điện thoại được phát hiện là và cũng nhận được thông tin múi giờ từ số điện thoại:

PhoneNumberOfflineGeocoder Results
Location        Australia

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

Nhưng số điện thoại Úc không hợp lệ ( (09) 9999 9999) trả về rằng đó không phải là số điện thoại hợp lệ.

Validation Results

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

Phiên bản của Google có mã cho Java và Javascript, nhưng mọi người cũng đã triển khai các thư viện cho các ngôn ngữ khác sử dụng bộ dữ liệu số điện thoại Google i18n:

Trừ khi bạn chắc chắn rằng bạn sẽ luôn chấp nhận các số từ một địa phương và chúng sẽ luôn ở một định dạng, tôi khuyên bạn không nên viết mã của riêng mình cho việc này và sử dụng libphonenumber để xác thực và hiển thị số điện thoại.


Lưu ý rằng bây giờ cũng có cổng Go tại: github.com/ttacon/libphonenumber
michaelhanson

Khi kiểm tra xem đó có phải là số có thể không, bạn cần chỉ định mã quốc gia? Tôi đang sử dụng phiên bản PHP và nếu tôi nhập một số tiếng Anh như (thay thế 0 bằng số thực) thì 07700000000tôi gặp Missing or invalid default region.lỗi. Nhưng nếu tôi chỉ định mã quốc gia, nó sẽ vượt qua.
BugHunterUK

FYI: Thư viện này không hỗ trợ một số quốc gia, phpinterviewquestions.co.in/blog/ionic/ mẹo
sijo vijayan

1
@BugHunterUK (và bất kỳ ai gặp câu hỏi này và tự hỏi tương tự) khi phân tích một số, bạn có thể chỉ định vùng dự kiến ​​và thư viện sẽ tìm các số không thuộc quốc tế trong khu vực đó. Nếu bạn không chỉ định, nó sẽ từ chối mọi thứ không có định dạng quốc tế hợp lệ.
IMSoP

Hãy xem xét github.com/nyaruka/phonenumbers vì nó đã trở thành gói Go "chính thức" được Google đề xuất thay vì libphonenumber.
DeeZone

78

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

Trận đấu này:

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

Trên $ n, nó tiết kiệm:

  1. Chỉ số quốc gia
  2. Số điện thoại
  3. Sự mở rộng

Bạn có thể kiểm tra nó trên https://www.regExal.com/?fam=99127


Đây là regex toàn diện nhất mà tôi đã thấy. Thật dễ dàng để có được xung quanh cho đến khi bạn loại bỏ ^$nếu không tôi có thể đi xung quanh nó bằng cách sử dụng [111] [111] [1111]hoặc 111--111--1111tương tự. (xin lỗi, đã xóa nhận xét cuối cùng của tôi)
bafromca

Bạn có thể vui lòng cụm từ lại? Tôi không thể hiểu điều này: "Thật dễ dàng để có được arround cho đến khi bạn xóa ^ và $ hoặc nếu không tôi có thể khắc phục bằng cách sử dụng [111] [111] [1111]". Điều đó có nghĩa là nó xác nhận '[111] [111] [1111]' khi bạn lấy ^$?
Ismael Miguel

Tôi đã sử dụng regex của bạn bằng cách sử dụng [111] [111] [1111]111--111--1111cho đến khi tôi gỡ bỏ ^$khỏi regex.
bafromca

11
^ ^ Đây là một ví dụ tuyệt vời về lý do tại sao các chủ đề bình luận KHÔNG nên đi đến trò chuyện. Tôi rất quan tâm đến cách cuộc trò chuyện này bật ra và cần biết liệu ReGex này có đủ mạnh để sử dụng trong ứng dụng của tôi không. Thật không may, cuộc trò chuyện bây giờ đã biến mất.
Matt Cashatt

1
Thành thật mà nói, tôi đã không đi trò chuyện. Sau khi hỏi nhiều lần để giải thích, tôi không có thông tin. Bạn luôn có thể tự thử với tất cả các loại số bạn tìm thấy trực tuyến, ở nhiều định dạng. Một điều tôi đã thử với cái này là sử dụng nhiều số điện thoại, nhưng nó không hoạt động tốt nếu chúng có không gian xung quanh. Và tôi phải tìm một giải pháp để đếm số lượng chữ số và thực thi một số tiền cụ thể.
Ismael Miguel

63

Mặc dù câu trả lời để loại bỏ tất cả các khoảng trắng là gọn gàng, nhưng nó không thực sự giải quyết được vấn đề đặt ra, đó là tìm một biểu thức chính quy. Lấy ví dụ, tập lệnh thử nghiệm của tôi tải xuống một trang web và trích xuất tất cả các số điện thoại bằng cách sử dụng biểu thức chính quy. Vì dù sao bạn cũng cần một regex, nên bạn cũng có thể có regex thực hiện tất cả công việc. Tôi nghĩ ra cái này:

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

Đây là một kịch bản perl để kiểm tra nó. Khi bạn khớp, $ 1 chứa mã vùng, $ 2 và $ 3 chứa số điện thoại và $ 5 chứa tiện ích mở rộng. Kịch bản thử nghiệm của tôi tải xuống một tệp từ internet và in tất cả các số điện thoại trong đó.

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

Biên tập:

Bạn có thể thay đổi \ W * thành \ s * \ W? \ S * trong biểu thức chính quy để thắt chặt lại một chút. Tôi đã không nghĩ về regex về mặt, giả sử, xác thực đầu vào của người dùng trên một biểu mẫu khi tôi viết nó, nhưng thay đổi này cho phép sử dụng regex cho mục đích đó.

'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
FYI regex cũng khớp: (4570457-6789đó sẽ là một lỗi đánh máy khá phổ biến. Các nhóm trận đấu cũng bị sai lệch: rubular.com/r/TaTP0mHL5c
SooDesuNe

@SooDesuNe Chuẩn bị (^|[^\d\n])(có cờ nhiều dòng) tránh được vấn đề chung, bằng cách đảm bảo rằng nó không ngay lập tức đi trước một số.
btown

Lưu ý rằng đây là trung tâm Bắc Mỹ - nó bỏ lỡ "44 7911 123456"
Ben Wheeler

43

Tôi đã trả lời câu hỏi này trên một câu hỏi SO khác trước khi quyết định đưa câu trả lời của mình làm câu trả lời cho chủ đề này, bởi vì không ai giải quyết làm thế nào để yêu cầu / không yêu cầu vật phẩm, chỉ đưa ra regexs: Regex làm việc sai, phù hợp với những điều không mong muốn

Từ bài đăng của tôi trên trang web đó, tôi đã tạo một hướng dẫn nhanh để hỗ trợ bất kỳ ai thực hiện regex của riêng họ cho định dạng số điện thoại mong muốn của họ, mà tôi sẽ cảnh báo (như tôi đã làm trên trang web khác) rằng nếu bạn quá hạn chế, bạn có thể không nhận được kết quả mong muốn và không có giải pháp "một kích thước phù hợp với tất cả" để chấp nhận tất cả các số điện thoại có thể có trên thế giới - chỉ những gì bạn quyết định chấp nhận là định dạng bạn chọn. Sử dụng có nguy cơ của riêng bạn.

Bảng cheat nhanh

  • Bắt đầu biểu thức: /^
  • Nếu bạn muốn yêu cầu một không gian, hãy sử dụng: [\s]hoặc\s
  • Nếu bạn muốn yêu cầu dấu ngoặc đơn, hãy sử dụng: [(][)]. Sử dụng \(\)là xấu xí và có thể làm cho mọi thứ khó hiểu.
  • Nếu bạn muốn bất cứ điều gì là tùy chọn, hãy đặt ?sau nó
  • Nếu bạn muốn một dấu gạch nối, chỉ cần gõ -hoặc [-]. Tuy nhiên, nếu bạn không đặt nó đầu tiên hoặc cuối cùng trong một loạt các ký tự khác, bạn có thể cần phải thoát nó: \-
  • Nếu bạn muốn chấp nhận các lựa chọn khác nhau trong một vị trí, hãy đặt dấu ngoặc quanh các tùy chọn: [-.\s]sẽ yêu cầu dấu gạch nối, dấu chấm hoặc dấu cách. Một dấu hỏi sau dấu ngoặc cuối sẽ làm cho tất cả các tùy chọn cho vị trí đó.
  • \d{3}: Yêu cầu số có 3 chữ số: 000-999. Viết tắt cho [0-9][0-9][0-9].
  • [2-9] : Yêu cầu một chữ số 2-9 cho khe đó.
  • (\+|1\s)?: Chấp nhận "cộng" hoặc 1 và dấu cách (ký tự ống |, là "hoặc") và làm cho nó tùy chọn. Dấu "cộng" phải được thoát.
  • Nếu bạn muốn số cụ thể khớp với một vị trí, hãy nhập chúng: [246]sẽ yêu cầu 2, 4 hoặc 6. [77|78]sẽ yêu cầu 77 hoặc 78.
  • $/ : Kết thúc biểu thức

1
Điều này rất hữu ích, nhưng tôi nghi ngờ và tìm kiếm một biểu thức {min, max}. Bạn có thể giúp?
Ataboy Josef

Nếu đó là một chữ số duy nhất mà chúng ta đang nói đến (và bạn có thể làm cho nó khớp với nó), hãy xem [2-9]khối tôi đặt ở đó. Điều đó có nghĩa là tối thiểu của bạn là 2 và tối đa của bạn là 9. Điều chỉnh cho phù hợp.
vapcguy

30

Tôi đã viết đơn giản nhất (mặc dù tôi không cần chấm trong đó).

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

Như đã đề cập dưới đây, nó chỉ kiểm tra các ký tự, không phải cấu trúc / thứ tự của nó


38
điều này xác nhận hàng tấn số không hợp lệ về mặt kỹ thuật. như, "- + () () ()) ())))". Học cách đọc các biểu thức thông thường để bạn có thể hiểu những gì bạn đang làm.
Steven Soroka

3
@StevenSoroka về mặt kỹ thuật có thể cho phép nhiều trường hợp không hợp lệ, nhưng khi chúng tôi nghĩ về việc chỉ giúp người dùng tránh các lỗi phổ biến với giải pháp đơn giản nhất có thể, đây là cách để đi :)
happyhardik

2
cái này cũng phù hợp với khoảng trắng, dòng trống
Wasim A.

1
@HappyHardik. Thật. Đơn giản và mạnh mẽ, để xác thực cơ bản cho phép người dùng nhập nhiều hơn một dấu chấm, dấu gạch ngang, dấu ngoặc hoặc dấu cộng.
dijipiji

Chỉ sử dụng nó và nó sai ở nhiều khía cạnh. Ví dụ: số điện thoại ở Vương quốc Anh có thể bắt đầu bằng +44 hoặc số điện thoại nuber có thể có (0) bên trong số đó. Nhưng điều này không hợp lệ theo biểu thức thông thường của bạn. Tôi muốn giới thiệu câu trả lời của @Ismael Miguel. Nó hoạt động tốt và tôi khuyên bạn nên xem lại câu trả lời của mình.
Stelios Voskos 29/07/2015

22

Nếu bạn chỉ muốn xác minh rằng bạn không có rác ngẫu nhiên trong trường (ví dụ: từ những kẻ gửi thư rác), biểu thức chính này sẽ hoạt động tốt:

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

Lưu ý rằng nó không có bất kỳ quy tắc đặc biệt nào về số lượng chữ số hoặc số nào hợp lệ trong các chữ số đó, nó chỉ xác minh rằng chỉ các chữ số, dấu ngoặc đơn, dấu gạch ngang, dấu cộng, dấu cách, dấu hoa thị, dấu chấm, dấu phẩy hoặc chữ cái e, x, tcó mặt.

Nó phải tương thích với các số quốc tế và định dạng nội địa hóa. Bạn có thấy trước bất kỳ nhu cầu nào cho phép dấu ngoặc vuông, xoăn hoặc góc cho một số vùng không? (hiện tại chúng không bao gồm).

Nếu bạn muốn duy trì các quy tắc trên mỗi chữ số (chẳng hạn như Mã vùng và Tiền tố Hoa Kỳ (mã trao đổi) phải nằm trong phạm vi 200-999), chúc bạn may mắn. Việc duy trì một bộ quy tắc phức tạp có thể bị lỗi thời tại bất kỳ thời điểm nào trong tương lai bởi bất kỳ quốc gia nào trên thế giới nghe có vẻ không vui.

Và trong khi tước tất cả / hầu hết các ký tự không phải là số có thể hoạt động tốt ở phía máy chủ (đặc biệt nếu bạn dự định chuyển các giá trị này cho trình quay số), bạn có thể không muốn phá vỡ đầu vào của người dùng trong khi xác thực, đặc biệt nếu bạn muốn chúng sửa chữa trong lĩnh vực khác.


22

Lưu ý rằng các ()ký tự tước không hoạt động theo kiểu viết các số phổ biến ở Vương quốc Anh: +44 (0) 1234 567890có nghĩa là quay số quốc tế:
+441234567890
hoặc trong quay số Anh01234567890


15

Bạn đã xem qua RegExLib chưa?

Nhập số điện thoại Hoa Kỳ mang lại khá nhiều danh sách các khả năng.


3
Đây có vẻ là một cách tuyệt vời để tích hợp các lỗi tối nghĩa vào mã của bạn.
Tom Lord

12

Nỗ lực của tôi tại một regex không hạn chế:

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

Chấp nhận:

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

Từ chối:

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

Tùy thuộc vào bạn để vệ sinh nó để hiển thị. Sau khi xác nhận nó có thể là một số mặc dù.


12

Tôi thấy điều này hoạt động khá tốt:

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

Nó hoạt động cho các định dạng số:

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

Hãy chắc chắn sử dụng cờ toàn cầu VÀ đa dòng để đảm bảo.

Liên kết: http://www.regexr.com/3bp4b


11

Nếu bạn đang nói về xác thực mẫu, thì biểu thức chính quy để xác thực ý nghĩa chính xác cũng như dữ liệu chính xác sẽ vô cùng phức tạp do các tiêu chuẩn quốc gia và nhà cung cấp khác nhau. Nó cũng sẽ khó để cập nhật.

Tôi diễn giải câu hỏi là tìm kiếm một mẫu hợp lệ rộng rãi, có thể không nhất quán trong nội bộ - ví dụ: có một bộ số hợp lệ, nhưng không xác thực rằng đường trung kế, trao đổi, v.v. thành mẫu hợp lệ cho tiền tố mã quốc gia .

Bắc Mỹ rất đơn giản và đối với quốc tế, tôi thích sử dụng mẫu 'thành ngữ' bao gồm các cách mọi người chỉ định và ghi nhớ số của họ:

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

Mẫu Bắc Mỹ đảm bảo rằng nếu bao gồm một dấu ngoặc đơn. Các tài khoản quốc tế cho một mã quốc gia '+' ban đầu và tùy chọn. Sau đó, bạn đang ở trong thành ngữ. Các kết quả hợp lệ sẽ là:

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

Điều này có thể sai lệch vì kinh nghiệm của tôi chỉ giới hạn ở Bắc Mỹ, Châu Âu và một chút châu Á.


Tôi đã cố gắng thực hiện những điều trên trong tập lệnh xác thực javascript của mình nhưng tôi vẫn gặp invalid quantifierlỗi. Bất cứ ý tưởng về những gì tôi đang làm sai?
Jannis

Tôi muốn thêm trường hợp tầm thường trong đó điện thoại được chỉ định không có ký hiệu nhưng có thể là dấu cách và mã quốc gia, ở châu Âu là điển hình cho các số điện thoại di động và địa phương: 676412342, 676 46 32 12, 676 463 212
rupps

11

Đây là một mô hình tuyệt vời phù hợp nhất với xác nhận mà tôi cần phải đạt được. Tôi không phải là tác giả gốc, nhưng tôi nghĩ rằng nó cũng đáng để chia sẻ vì tôi thấy vấn đề này rất phức tạp và không có câu trả lời ngắn gọn hoặc hữu ích rộng rãi.

Regex sau đây sẽ nắm bắt các kết hợp số và ký tự được sử dụng rộng rãi trong nhiều định dạng số điện thoại toàn cầu:

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

Tích cực:
+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

Tiêu cực:
926 3 4
8 800 600-APPLE

Nguồn gốc: http://www.regexr.com/38pvb


Điều này có một số hỗ trợ hạn chế cho các phần mở rộng. Nó phù hợp với "616-555-1234 x567" chứ không phải "616-555-1234 máy lẻ 567".
Jon Schneider

2
Sai tích cực cho ví dụ "------- ((((((55555555" hoặc "99999999999999999999999"
mikep

Nó không xác thực số Nitherland macdonalds +31 76 596 4192 (Tôi chỉ kiểm tra các số ngẫu nhiên)
BIOHAZARD

10

Cảm giác ruột của tôi được củng cố bởi số lượng câu trả lời cho chủ đề này - rằng có một số lượng giải pháp gần như vô hạn cho vấn đề này, không có giải pháp nào trong số đó sẽ trở nên thanh lịch.

Thành thật mà nói, tôi khuyên bạn không nên cố gắng xác thực số điện thoại. Ngay cả khi bạn có thể viết một trình xác nhận lớn, có lông cho phép tất cả các định dạng hợp pháp khác nhau, thì cuối cùng nó sẽ cho phép khá nhiều thứ thậm chí giống như số điện thoại ở nơi đầu tiên.

Theo tôi, giải pháp tao nhã nhất là xác nhận độ dài tối thiểu, không có gì hơn.


Sau khi thử một số trong số này và xem qua dữ liệu và phản hồi hiện có từ người dùng, tôi sẽ có xu hướng đồng ý ...
Christopher King

Đôi khi bạn cần phải xác nhận mặc dù. Nếu tôi đang gửi mã xác nhận, tôi không thể gửi mã đến bất kỳ rác ngẫu nhiên nào mà người gửi thư rác đã nhập vào trường. Tôi muốn chắc chắn rằng số này có thể là số điện thoại trước khi lãng phí tài nguyên nhắn tin cho nó.
Lu-ca

10

Đây là mẫu Biểu thức chính quy đơn giản cho các số điện thoại di động của Philippines:

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

hoặc là

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

sẽ phù hợp với những điều này:

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

Mã thứ nhất sẽ khớp với BẤT K code mã quốc gia gồm hai chữ số, trong khi mã thứ hai sẽ khớp riêng với mã quốc gia Philippines.

Kiểm tra nó ở đây: http://refiddle.com/1ox


Cảm ơn. Làm thế nào về số điện thoại cố định với mã vùng như 028231234? Tôi đang tự hỏi nếu mã vùng chỉ có 2-3 chữ số và chúng có luôn đứng trước 0 không?
bão

9

Đây là cố gắng tốt nhất của tôi cho đến nay. Nó xử lý các định dạng trên nhưng tôi chắc chắn tôi đang thiếu một số định dạng có thể khác.

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

9

Bạn sẽ có một thời gian khó khăn để xử lý các số quốc tế với một regex đơn / đơn giản, xem bài đăng này về những khó khăn của các số điện thoại quốc tế (và thậm chí cả Bắc Mỹ).

Bạn sẽ muốn phân tích một vài chữ số đầu tiên để xác định mã quốc gia là gì, sau đó hành động khác nhau dựa trên quốc gia.

Ngoài ra - danh sách bạn đưa ra không bao gồm một định dạng phổ biến khác của Hoa Kỳ - bỏ qua 1. Ban đầu, hầu hết các điện thoại di động ở Hoa Kỳ không yêu cầu và nó sẽ bắt đầu gây trở ngại cho thế hệ trẻ trừ khi họ đã quay số quốc tế.

Bạn đã xác định chính xác rằng đó là một vấn đề khó khăn ...

-Adam


Không phải là một giải pháp được cung cấp. ĐIỀU ĐÓ LÀ CÓ THỂ. Chỉ vì nó phức tạp hay phức tạp không có nghĩa là bạn nên giơ tay lên.
Eric Hodonsky

7

Sau khi đọc qua những câu trả lời này, có vẻ như không có biểu thức chính quy đơn giản nào có thể phân tích cú pháp qua một loạt văn bản và rút số điện thoại ở bất kỳ định dạng nào (kể cả quốc tế có và không có dấu cộng).

Đây là những gì tôi đã sử dụng cho một dự án khách hàng gần đây, nơi chúng tôi phải chuyển đổi tất cả các số điện thoại ở bất kỳ định dạng nào sang tel: links.

Cho đến nay, nó đã hoạt động với mọi thứ họ đã ném vào nó, nhưng nếu có lỗi xảy ra, tôi sẽ cập nhật câu trả lời này.

Chế độ:

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

Chức năng PHP để thay thế tất cả các số điện thoại bằng tel: links (trong trường hợp có ai tò mò):

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

Biểu thức chính quy này phù hợp +1 1234562222222222222222222222.
Varda Elentári

Tại sao không trở về?
thexande

Sai dương tính với "999999999999999999999999999999999999999"
Ben Wheeler

6

Tôi tin rằng các mô-đun Number :: Phone :: USRegapi :: Common (đặc biệt là nguồn của Regapi :: Common :: URI :: RFC2806 ) có thể giúp ích.

Câu hỏi có lẽ nên được chỉ định chi tiết hơn một chút để giải thích mục đích xác nhận các con số. Chẳng hạn, 911 là số hợp lệ ở Hoa Kỳ, nhưng 911x không có giá trị x. Điều đó để công ty điện thoại có thể tính toán khi bạn quay số xong. Có một số biến thể về vấn đề này. Nhưng regex của bạn không kiểm tra phần mã vùng, do đó dường như không phải là vấn đề đáng lo ngại.

Giống như xác nhận địa chỉ email, ngay cả khi bạn có kết quả hợp lệ, bạn không thể biết liệu nó có được gán cho ai đó cho đến khi bạn thử không.

Nếu bạn đang cố gắng xác thực đầu vào của người dùng, tại sao không bình thường hóa kết quả và được thực hiện với nó? Nếu người dùng nhập số mà bạn không thể nhận ra là số hợp lệ, hãy lưu số đó dưới dạng nhập hoặc loại bỏ các ký tự không có sẵn. Các Số :: Điện thoại :: Normalize mô-đun Perl có thể là một nguồn cảm hứng.


Tôi sẽ đi ra ngoài ở đây và nói rằng cho phép 911 làm số điện thoại có lẽ là một ý tưởng tồi trong hầu hết các ứng dụng của regex này. Bắt tốt mặc dù.
Nicholas Flynt

4

Tôi làm việc cho một công ty nghiên cứu thị trường và chúng tôi phải lọc các loại đầu vào này theo thời gian. Bạn đang làm phức tạp nó quá nhiều. Chỉ cần loại bỏ các ký tự không chữ và số, và xem nếu có một phần mở rộng.

Để phân tích sâu hơn, bạn có thể đăng ký một trong nhiều nhà cung cấp sẽ cung cấp cho bạn quyền truy cập vào cơ sở dữ liệu về các số hợp lệ cũng như cho bạn biết nếu chúng là điện thoại cố định hoặc điện thoại di động, bị ngắt kết nối, v.v.


Thẩm định? 123% $) *% () $ * () # 456 * () * $ # (* (# $ @ 8908 sẽ phù hợp với giải pháp đề xuất của bạn.
PlexQ

1
@PlexQ 555-123-1234, 07777777777, 90210, 01/01/1901 - người dùng có thể sáng tạo trong việc phân tán rác thông qua xác nhận. Tốt hơn hết là đừng loại bỏ những người thực sự có một số dữ liệu kỳ lạ bằng cách sử dụng xác nhận quá hạn chế và nói với họ rằng họ đã sai.
ReactiveRaven

4

Thay thế định dạng ký tự, sau đó kiểm tra tính còn lại của điện thoại. Trong PHP,

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

Phá vỡ một biểu thức chính quy phức tạp như thế này có thể hiệu quả, nhưng đơn giản hơn nhiều.


3

Tôi thấy điều này là một cái gì đó thú vị. Tôi chưa thử nó nhưng có vẻ như nó sẽ hoạt động

<?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
Thông điệp của bạn dường như cho thấy rằng bạn đã không viết mã này. Bạn có phiền trích dẫn một nguồn, xin vui lòng?
Alastair Irvine


3

Bạn có thể sẽ tốt hơn khi sử dụng Mặt nạ đầu vào cho việc này. Bằng cách đó, người dùng CHỈ có thể nhập số và bạn có thể định dạng theo cách bạn thấy phù hợp. Tôi không chắc đây có phải là một ứng dụng web hay không, nhưng nếu nó có một plugin jQuery rất nhấp cung cấp một số tùy chọn để thực hiện việc này.

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

Họ thậm chí còn tìm hiểu cách che dấu đầu vào số điện thoại trong hướng dẫn của họ.


3

Đây là một trong những hoạt động tốt trong JavaScript. Đó là một chuỗi bởi vì đó là những gì tiện ích Dojo đang mong đợi.

Nó khớp với số NANP 10 chữ số Bắc Mỹ với phần mở rộng tùy chọn. Dấu cách, dấu gạch ngang và dấu chấm được chấp nhận dấu phân cách.

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

3

Tôi đã vật lộn với cùng một vấn đề, cố gắng làm cho ứng dụng của mình trở thành bằng chứng trong tương lai, nhưng những người này đã đưa tôi đi đúng hướng. Tôi thực sự không kiểm tra chính số đó để xem nó có hoạt động hay không, tôi chỉ cố gắng đảm bảo rằng một loạt các số được nhập có thể có hoặc không có phần mở rộng.

Trường hợp xấu nhất nếu người dùng phải lấy một số chưa được định dạng từ tệp XML, họ vẫn sẽ chỉ nhập các số vào bảng số điện thoại 012345678x5, không có lý do thực sự để giữ cho số đó đẹp. Loại RegEx đó sẽ xuất hiện một cái gì đó như thế này đối với tôi:

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

2

Quan điểm của tôi là đồng ý rằng tước bỏ các chữ số và chỉ chấp nhận những gì tốt nhất. Có thể để đảm bảo có ít nhất một vài chữ số, mặc dù điều đó không cấm một số thứ như số điện thoại chữ cái "ASK-JAKE" chẳng hạn.

Một vài biểu thức perl đơn giản có thể là:

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

Sử dụng cái đầu tiên để giữ các nhóm chữ số lại với nhau, có thể đưa ra các đầu mối định dạng. Sử dụng cái thứ hai để ném tất cả các chữ số không quan trọng.

Có phải lo lắng rằng có thể cần phải tạm dừng và sau đó nhập thêm khóa? Hoặc một cái gì đó như 555-1212 (chờ tiếng bíp) 123?


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

Phải kết thúc bằng một chữ số, có thể bắt đầu bằng (hoặc + hoặc một chữ số và có thể chứa + - (hoặc)


2

Đối với bất kỳ ai quan tâm đến việc làm một cái gì đó tương tự với số điện thoại di động của Ailen, đây là một cách đơn giản để thực hiện nó:

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

Ngoài ra còn có một giải pháp JQuery trên liên kết đó.

BIÊN TẬP:

Giải pháp jQuery:

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


});

Nguồn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.