phone.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. (function($) {
  2. $.fn.bootstrapValidator.i18n.phone = $.extend($.fn.bootstrapValidator.i18n.phone || {}, {
  3. 'default': 'Please enter a valid phone number',
  4. countryNotSupported: 'The country code %s is not supported',
  5. country: 'Please enter a valid phone number in %s',
  6. countries: {
  7. BR: 'Brazil',
  8. CN: 'China',
  9. DK: 'Denmark',
  10. ES: 'Spain',
  11. FR: 'France',
  12. GB: 'United Kingdom',
  13. MA: 'Morocco',
  14. PK: 'Pakistan',
  15. RO: 'Romania',
  16. US: 'USA'
  17. }
  18. });
  19. $.fn.bootstrapValidator.validators.phone = {
  20. html5Attributes: {
  21. message: 'message',
  22. country: 'country'
  23. },
  24. // The supported countries
  25. COUNTRY_CODES: ['BR', 'CN', 'DK', 'ES', 'FR', 'GB', 'MA', 'PK', 'RO', 'US'],
  26. /**
  27. * Return true if the input value contains a valid phone number for the country
  28. * selected in the options
  29. *
  30. * @param {BootstrapValidator} validator Validate plugin instance
  31. * @param {jQuery} $field Field element
  32. * @param {Object} options Consist of key:
  33. * - message: The invalid message
  34. * - country: The ISO-3166 country code. It can be
  35. * - A country code
  36. * - Name of field which its value defines the country code
  37. * - Name of callback function that returns the country code
  38. * - A callback function that returns the country code
  39. *
  40. * @returns {Boolean|Object}
  41. */
  42. validate: function(validator, $field, options) {
  43. var value = $field.val();
  44. if (value === '') {
  45. return true;
  46. }
  47. var country = options.country;
  48. if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {
  49. // Try to determine the country
  50. country = validator.getDynamicOption($field, country);
  51. }
  52. if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
  53. return {
  54. valid: false,
  55. message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.phone.countryNotSupported, country)
  56. };
  57. }
  58. var isValid = true;
  59. switch (country.toUpperCase()) {
  60. case 'BR':
  61. // Test: http://regexr.com/399m1
  62. value = $.trim(value);
  63. isValid = (/^(([\d]{4}[-.\s]{1}[\d]{2,3}[-.\s]{1}[\d]{2}[-.\s]{1}[\d]{2})|([\d]{4}[-.\s]{1}[\d]{3}[-.\s]{1}[\d]{4})|((\(?\+?[0-9]{2}\)?\s?)?(\(?\d{2}\)?\s?)?\d{4,5}[-.\s]?\d{4}))$/).test(value);
  64. break;
  65. case 'CN':
  66. // http://regexr.com/39dq4
  67. value = $.trim(value);
  68. isValid = (/^((00|\+)?(86(?:-| )))?((\d{11})|(\d{3}[- ]{1}\d{4}[- ]{1}\d{4})|((\d{2,4}[- ]){1}(\d{7,8}|(\d{3,4}[- ]{1}\d{4}))([- ]{1}\d{1,4})?))$/).test(value);
  69. break;
  70. case 'DK':
  71. // Mathing DK phone numbers with country code in 1 of 3 formats and an
  72. // 8 digit phone number not starting with a 0 or 1. Can have 1 space
  73. // between each character except inside the country code.
  74. // Test: http://regex101.com/r/sS8fO4/1
  75. value = $.trim(value);
  76. isValid = (/^(\+45|0045|\(45\))?\s?[2-9](\s?\d){7}$/).test(value);
  77. break;
  78. case 'ES':
  79. // http://regex101.com/r/rB9mA9/1
  80. value = $.trim(value);
  81. isValid = (/^(?:(?:(?:\+|00)34\D?))?(?:9|6)(?:\d\D?){8}$/).test(value);
  82. break;
  83. case 'FR':
  84. // http://regexr.com/39a2p
  85. value = $.trim(value);
  86. isValid = (/^(?:(?:(?:\+|00)33[ ]?(?:\(0\)[ ]?)?)|0){1}[1-9]{1}([ .-]?)(?:\d{2}\1?){3}\d{2}$/).test(value);
  87. break;
  88. case 'GB':
  89. // http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers#Match_GB_telephone_number_in_any_format
  90. // Test: http://regexr.com/38uhv
  91. value = $.trim(value);
  92. isValid = (/^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$/).test(value);
  93. break;
  94. case 'MA':
  95. // http://en.wikipedia.org/wiki/Telephone_numbers_in_Morocco
  96. // Test: http://regexr.com/399n8
  97. value = $.trim(value);
  98. isValid = (/^(?:(?:(?:\+|00)212[\s]?(?:[\s]?\(0\)[\s]?)?)|0){1}(?:5[\s.-]?[2-3]|6[\s.-]?[13-9]){1}[0-9]{1}(?:[\s.-]?\d{2}){3}$/).test(value);
  99. break;
  100. case 'PK':
  101. // http://regex101.com/r/yH8aV9/2
  102. value = $.trim(value);
  103. isValid = (/^0?3[0-9]{2}[0-9]{7}$/).test(value);
  104. break;
  105. case 'RO':
  106. // All mobile network and land line
  107. isValid = (/^(\+4|)?(07[0-8]{1}[0-9]{1}|02[0-9]{2}|03[0-9]{2}){1}?(\s|\.|\-)?([0-9]{3}(\s|\.|\-|)){2}$/g).test(value);
  108. break;
  109. case 'US':
  110. /* falls through */
  111. default:
  112. // Make sure US phone numbers have 10 digits
  113. // May start with 1, +1, or 1-; should discard
  114. // Area code may be delimited with (), & sections may be delimited with . or -
  115. // Test: http://regexr.com/38mqi
  116. value = value.replace(/\D/g, '');
  117. isValid = (/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/).test(value) && (value.length === 10);
  118. break;
  119. }
  120. return {
  121. valid: isValid,
  122. message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.phone.country, $.fn.bootstrapValidator.i18n.phone.countries[country])
  123. };
  124. }
  125. };
  126. }(window.jQuery));