15815213711
2024-08-26 67b8b6731811983447e053d4396b3708c14dfe3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import {
    MIN_LENGTH_FOR_NSN,
    VALID_DIGITS,
    VALID_PUNCTUATION,
    PLUS_CHARS
} from '../constants.js'
 
import createExtensionPattern from './extension/createExtensionPattern.js'
 
//  Regular expression of viable phone numbers. This is location independent.
//  Checks we have at least three leading digits, and only valid punctuation,
//  alpha characters and digits in the phone number. Does not include extension
//  data. The symbol 'x' is allowed here as valid punctuation since it is often
//  used as a placeholder for carrier codes, for example in Brazilian phone
//  numbers. We also allow multiple '+' characters at the start.
//
//  Corresponds to the following:
//  [digits]{minLengthNsn}|
//  plus_sign*
//  (([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])*
//
//  The first reg-ex is to allow short numbers (two digits long) to be parsed if
//  they are entered as "15" etc, but only if there is no punctuation in them.
//  The second expression restricts the number of digits to three or more, but
//  then allows them to be in international form, and to have alpha-characters
//  and punctuation. We split up the two reg-exes here and combine them when
//  creating the reg-ex VALID_PHONE_NUMBER_PATTERN itself so we can prefix it
//  with ^ and append $ to each branch.
//
//  "Note VALID_PUNCTUATION starts with a -,
//   so must be the first in the range" (c) Google devs.
//  (wtf did they mean by saying that; probably nothing)
//
const MIN_LENGTH_PHONE_NUMBER_PATTERN = '[' + VALID_DIGITS + ']{' + MIN_LENGTH_FOR_NSN + '}'
//
// And this is the second reg-exp:
// (see MIN_LENGTH_PHONE_NUMBER_PATTERN for a full description of this reg-exp)
//
export const VALID_PHONE_NUMBER =
    '[' + PLUS_CHARS + ']{0,1}' +
    '(?:' +
        '[' + VALID_PUNCTUATION + ']*' +
        '[' + VALID_DIGITS + ']' +
    '){3,}' +
    '[' +
        VALID_PUNCTUATION +
        VALID_DIGITS +
    ']*'
 
// This regular expression isn't present in Google's `libphonenumber`
// and is only used to determine whether the phone number being input
// is too short for it to even consider it a "valid" number.
// This is just a way to differentiate between a really invalid phone
// number like "abcde" and a valid phone number that a user has just
// started inputting, like "+1" or "1": both these cases would be
// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this
// library can provide a more detailed error message — whether it's
// really "not a number", or is it just a start of a valid phone number.
const VALID_PHONE_NUMBER_START_REG_EXP = new RegExp(
    '^' +
    '[' + PLUS_CHARS + ']{0,1}' +
    '(?:' +
        '[' + VALID_PUNCTUATION + ']*' +
        '[' + VALID_DIGITS + ']' +
    '){1,2}' +
    '$'
, 'i')
 
export const VALID_PHONE_NUMBER_WITH_EXTENSION =
    VALID_PHONE_NUMBER +
    // Phone number extensions
    '(?:' + createExtensionPattern() + ')?'
 
// The combined regular expression for valid phone numbers:
//
const VALID_PHONE_NUMBER_PATTERN = new RegExp(
    // Either a short two-digit-only phone number
    '^' +
        MIN_LENGTH_PHONE_NUMBER_PATTERN +
    '$' +
    '|' +
    // Or a longer fully parsed phone number (min 3 characters)
    '^' +
        VALID_PHONE_NUMBER_WITH_EXTENSION +
    '$'
, 'i')
 
// Checks to see if the string of characters could possibly be a phone number at
// all. At the moment, checks to see that the string begins with at least 2
// digits, ignoring any punctuation commonly found in phone numbers. This method
// does not require the number to be normalized in advance - but does assume
// that leading non-number symbols have been removed, such as by the method
// `extract_possible_number`.
//
export default function isViablePhoneNumber(number) {
    return number.length >= MIN_LENGTH_FOR_NSN &&
        VALID_PHONE_NUMBER_PATTERN.test(number)
}
 
// This is just a way to differentiate between a really invalid phone
// number like "abcde" and a valid phone number that a user has just
// started inputting, like "+1" or "1": both these cases would be
// considered `NOT_A_NUMBER` by Google's `libphonenumber`, but this
// library can provide a more detailed error message — whether it's
// really "not a number", or is it just a start of a valid phone number.
export function isViablePhoneNumberStart(number) {
    return VALID_PHONE_NUMBER_START_REG_EXP.test(number)
}