Don’t. That’s right: don’t validate phone numbers!
Perhaps you want to check, not what a phone number looks like, but rather that the user can access the phone they are telling you they own. If that’s what you needed: send a text or a call with a code to verify the account. As a bonus, your user and your system will then be typo-proof.
So then again, don’t validate phone numbers. You can check it isn’t blank (empty or filled with space/tab characters), but just keep the format people want you to store:
- France likes spaces or dots, groups of two 01.23.45.67.89
- UK likes groups of three 01 23 456 789
- services in the US like mnemonics like 01234-PIZZA
- you might later want special or foreign numbers
Validating numericality will remove all of these:
- 01 23 45 67 89 -> 0123456789 (legibility)
- 0800 123 123 -> 0800123123 (123.123 is more memorable than 12.31.23)
- 0800 42 42 42 -> 0800424242 (0800 means free number, French people like it better than 08.00)
- 0800 1 PIZZA -> KO or 0800174992 (there are gems to find mnemonics IIRC)
- a shorter phone number that’s inside a company’s office -> KO
- foreign number: +49 (0) 123456789 -> KO
- special numbers like 911 -> KO
I don’t always say that, but: trust people, not code ;)