Maintaining clean contact data maximizes your revenue and improves your business performance.
It turns out that there's something of a spec for this, at least for North America, called the NANP. Beyond that - the list you gave does not include another common US format - leaving off the initial 1.
Like validating email addresses, even if you have a valid result you can't know if it's assigned to someone until you try it.
If you are trying to validate user input, why not normalize the result and be done with it?
You'll want to parse the first few digits to determine what the country code is, then act differently based on the country.
Validate international phone numbers from 240 countries world-wide and get accurate status results with our phone list validator.Identifying incorrect or outdated phone numbers avoids frustration, saves you a lot of time & money and makes the phone an efficient and effective communication channel for your business: Verify phone numbers in real-time right at the point of entry with Byteplant's Phone Validator API.We help you increase conversions and reduce fraud, maintaining relevant regulations compliance. I came up with this: Here's a perl script to test it. It should be compatible with international numbers and localization formats. Since you'd need a regex anyway, you might as well have the regex do all the work. I answered this question on another SO question before deciding to also include my answer as an answer on this thread, because no one was addressing how to require/not require items, just handing out regexs: Regex working wrong, matching unexpected things From my post on that site, I've created a quick guide to assist anyone with making their own regex for their own desired phone number format, which I will caveat (like I did on the other site) that if you are too restrictive, you may not get the desired results, and there is no "one size fits all" solution to accepting all possible phone numbers in the world - only what you decide to accept as your format of choice. Note that it doesn't have any special rules for how many digits, or what numbers are valid in those digits, it just verifies that only digits, parenthesis, dashes, plus, space, pound, asterisk, period, comma, or the letters are present.
123 Validation Results Result from is Possible Number() true Result from is Valid Number() 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 Unless you are certain that you are always going to be accepting numbers from one locale, and they are always going to be in one format, I would heavily suggest not writing your own code for this, and using libphonenumber for validating and displaying phone numbers.