Skip to content

Commit 0b3e34c

Browse files
g1smdjzaefferer
authored andcommitted
Optimise RegEx patterns, especially for UK phone numbers.
1 parent 4290ab5 commit 0b3e34c

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

additional-methods.js

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ jQuery.validator.addMethod("dateNL", function(value, element) {
158158
}, "Vul hier een geldige datum in.");
159159

160160
jQuery.validator.addMethod("time", function(value, element) {
161-
return this.optional(element) || /^([0-1][0-9]|2[0-3]):([0-5][0-9])$/.test(value);
161+
return this.optional(element) || /^([0-1]\d|2[0-3]):([0-5]\d)$/.test(value);
162162
}, "Please enter a valid time, between 00:00 and 23:59");
163163
jQuery.validator.addMethod("time12h", function(value, element) {
164164
return this.optional(element) || /^((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))$/i.test(value);
@@ -171,10 +171,8 @@ jQuery.validator.addMethod("time12h", function(value, element) {
171171
* allows '-' or ' ' as a separator and allows parens around area code
172172
* some people may want to put a '1' in front of their number
173173
*
174-
* 1(212)-999-2345
175-
* or
176-
* 212 999 2344
177-
* or
174+
* 1(212)-999-2345 or
175+
* 212 999 2344 or
178176
* 212-999-0983
179177
*
180178
* but not
@@ -185,32 +183,38 @@ jQuery.validator.addMethod("time12h", function(value, element) {
185183
jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
186184
phone_number = phone_number.replace(/\s+/g, "");
187185
return this.optional(element) || phone_number.length > 9 &&
188-
phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
186+
phone_number.match(/^(\+?1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
189187
}, "Please specify a valid phone number");
190188

191189
jQuery.validator.addMethod('phoneUK', function(phone_number, element) {
192-
phone_number = phone_number.replace(/\s+|-/g,'');
190+
phone_number = phone_number.replace(/\(|\)|\s+|-/g,'');
193191
return this.optional(element) || phone_number.length > 9 &&
194-
phone_number.match(/^(\(?(0|\+44)[1-9]{1}\d{1,4}?\)?\s?\d{3,4}\s?\d{3,4})$/);
192+
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:(?:\d{5}\)?\s?\d{4,5})|(?:\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3}))|(?:\d{3}\)?\s?\d{3}\s?\d{3,4})|(?:\d{2}\)?\s?\d{4}\s?\d{4}))$/);
195193
}, 'Please specify a valid phone number');
196194

197195
jQuery.validator.addMethod('mobileUK', function(phone_number, element) {
198196
phone_number = phone_number.replace(/\s+|-/g,'');
199197
return this.optional(element) || phone_number.length > 9 &&
200-
phone_number.match(/^((0|\+44)7(0|4|5|6|7|8|9){1}\d{2}\s?\d{6})$/);
198+
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[45789]\d{2}|624)\s?\d{3}\s?\d{3})$/);
201199
}, 'Please specify a valid mobile number');
202200

203201
//Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
204202
jQuery.validator.addMethod('phonesUK', function(phone_number, element) {
205203
phone_number = phone_number.replace(/\s+|-/g,'');
206204
return this.optional(element) || phone_number.length > 9 &&
207-
phone_number.match(/^(0[1-3]{1}[0-9]{8,9})$/) || phone_number.match(/^(07[5-9]{1}[0-9]{7,8})$/);
205+
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[45789]\d{8}|624\d{6})))$/);
208206
}, 'Please specify a valid uk phone number');
207+
// On the above three UK functions, do the following server side processing:
208+
// Compare with ^((?:00\s?|\+)(44)\s?)?\(?0?(?:\)\s?)?([1-9]\d{1,4}\)?[\d\s]+)
209+
// Extract $2 and set $prefix to '+44<space>' if $2 is '44' otherwise set $prefix to '0'
210+
// Extract $3 and remove spaces and parentheses. Phone number is combined $2 and $3.
211+
// A number of very detailed GB telephone number RegEx patterns can also be found at:
212+
// http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_UK_Telephone_Numbers
209213

210214
//Matches UK postcode. based on http://snipplr.com/view/3152/postcode-validation/
211215
jQuery.validator.addMethod('postcodeUK', function(postcode, element) {
212216
postcode = (postcode.toUpperCase()).replace(/\s+/g,'');
213-
return this.optional(element) || postcode.match(/^([^QZ]{1}[^IJZ]{0,1}[0-9]{1,2})([0-9]{1}[^CIKMOV]{2})$/) || postcode.match(/^([^QV]{1}[0-9]{1}[ABCDEFGHJKSTUW]{1})([0-9]{1}[^CIKMOV]{2})$/) || postcode.match(/^([^QV]{1}[^IJZ][0-9]{1}[ABEHMNPRVWXY])([0-9]{1}[^CIKMOV]{2})$/) || postcode.match(/^(GIR)(0AA)$/) || postcode.match(/^(BFPO)([0-9]{1,4})$/) || postcode.match(/^(BFPO)(C\/O[0-9]{1,3})$/);
217+
return this.optional(element) || postcode.match(/^([^QZ][^IJZ]{0,1}\d{1,2})(\d[^CIKMOV]{2})$/) || postcode.match(/^([^QV]\d[ABCDEFGHJKSTUW])(\d[^CIKMOV]{2})$/) || postcode.match(/^([^QV][^IJZ]\d[ABEHMNPRVWXY])(\d[^CIKMOV]{2})$/) || postcode.match(/^(GIR)(0AA)$/) || postcode.match(/^(BFPO)(\d{1,4})$/) || postcode.match(/^(BFPO)(C\/O\d{1,3})$/);
214218
}, 'Please specify a valid postcode');
215219

216220
// TODO check if value starts with <, otherwise don't try stripping anything
@@ -259,19 +263,19 @@ jQuery.validator.addMethod("creditcardtypes", function(value, element, param) {
259263
if (param.all)
260264
validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
261265

262-
if (validTypes & 0x0001 && /^(51|52|53|54|55)/.test(value)) { //mastercard
266+
if (validTypes & 0x0001 && /^(5[12345])/.test(value)) { //mastercard
263267
return value.length == 16;
264268
}
265269
if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
266270
return value.length == 16;
267271
}
268-
if (validTypes & 0x0004 && /^(34|37)/.test(value)) { //amex
272+
if (validTypes & 0x0004 && /^(3[47])/.test(value)) { //amex
269273
return value.length == 15;
270274
}
271-
if (validTypes & 0x0008 && /^(300|301|302|303|304|305|36|38)/.test(value)) { //dinersclub
275+
if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) { //dinersclub
272276
return value.length == 14;
273277
}
274-
if (validTypes & 0x0010 && /^(2014|2149)/.test(value)) { //enroute
278+
if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) { //enroute
275279
return value.length == 15;
276280
}
277281
if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
@@ -290,7 +294,7 @@ jQuery.validator.addMethod("creditcardtypes", function(value, element, param) {
290294
}, "Please enter a valid credit card number.");
291295

292296
jQuery.validator.addMethod("ipv4", function(value, element, param) {
293-
return this.optional(element) || /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i.test(value);
297+
return this.optional(element) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value);
294298
}, "Please enter a valid IP v4 address.");
295299

296300
jQuery.validator.addMethod("ipv6", function(value, element, param) {

test/methods.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -554,11 +554,17 @@ test("phone (us)", function() {
554554

555555
test("mobileUK", function() {
556556
var method = methodTest("mobileUK");
557-
ok( method( "07434234323" ), "Valid UK Mobile Number" );
558-
ok( method( "07011111111" ), "Valid UK Mobile Number" );
559-
ok( method( "+447011111111" ), "Valid UK Mobile Number" );
560-
ok( !method( "07334234323" ), "Invalid UK Mobile Number" );
561-
ok( !method( "11111111111" ), "Invalid UK Mobile Number" );
557+
ok( method( "07734234323" ), "Valid UK Mobile Number" );
558+
ok( method( "+447734234323" ), "Valid UK Mobile Number" );
559+
ok( !method( "07034234323" ), "Invalid UK Mobile Number" );
560+
ok( !method( "0753423432" ), "Invalid UK Mobile Number" );
561+
ok( !method( "07604234323" ), "Invalid UK Mobile Number" );
562+
ok( !method( "077342343234" ), "Invalid UK Mobile Number" );
563+
ok( !method( "044342343234" ), "Invalid UK Mobile Number" );
564+
ok( !method( "+44753423432" ), "Invalid UK Mobile Number" );
565+
ok( !method( "+447604234323" ), "Invalid UK Mobile Number" );
566+
ok( !method( "+4477342343234" ), "Invalid UK Mobile Number" );
567+
ok( !method( "+4444342343234" ), "Invalid UK Mobile Number" );
562568
});
563569

564570
test("dateITA", function() {

0 commit comments

Comments
 (0)