Regex Italian phone number
Italy has no trunk prefix: the 0 of landline numbers is part of the number and is also dialled from abroad, so +39 06 1234 5678 is correct and +39 6 1234 5678 is not. A landline starts with 0 followed by an area code of 1 to 3 digits, a mobile starts with 3 and has 9 or 10 digits, toll-free numbers start with 800 or 803. validator.js's mobile regex refuses every landline, Drupal's accepts '999 1234567', and CakePHP's accepts the empty string. Here's a pattern separating landlines, mobiles and toll-free numbers, compared against those attempts.
/^(?:(?:\+|00)39 ?)?(?:0[1-9](?:[ ./-]?[0-9]){4,8}|3(?:[2-9](?:[ ./-]?[0-9]){7,8}|1(?:[ ./-]?[0-9]){8})|80(?:0(?:[ ./-]?[0-9]){6}|3(?:[ ./-]?[0-9]){3})|84(?:[08](?:[ ./-]?[0-9]){6}|[17](?:[ ./-]?[0-9]){3}))$/passes 33/33 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js (it-IT) — mobiles seulement : tout fixe refusé (« 06 1234 5678 ») ; 3xx où xx vaut « 00 » à « 19 » passe (« 300 1234567 ») ; « 39 320 1234567 » sans + passe ; « 320 123 4567 » (espace entre les groupes) rejeté | ^(\+?39)?\s?3\d{2} ?\d{6,7}$ | 16 / 33 | safe |
| CakePHP localized (ItValidation::phone) — la chaîne vide passe, comme « 0 », « 123 » et n'importe quelle suite de chiffres avec au plus un tiret, une espace et une barre ; « +39 06 1234 5678 » rejeté | ^(\d*\-?\ ?\/?\d*)$ | 17 / 33 | vulnerable (000000000000000000000000000000000000000000000000000000000000…) |
| Drupal phone (7.x-1.x, phone.it.inc) — n'impose ni 0 ni 3 en tête : « 999 1234567 » et « 12 123456 » passent ; « 06 12345 » (fixe court) rejeté, comme « +39 06 1234 5678 » et « 320 123 4567 » (plusieurs espaces) | ^(\+39)?[ ]?([0-9]{2,3}(\/|-| )?[0-9]{6,7})$ | 20 / 33 | safe |
Implementation
const re = new RegExp("^(?:(?:\\+|00)39 ?)?(?:0[1-9](?:[ ./-]?[0-9]){4,8}|3(?:[2-9](?:[ ./-]?[0-9]){7,8}|1(?:[ ./-]?[0-9]){8})|80(?:0(?:[ ./-]?[0-9]){6}|3(?:[ ./-]?[0-9]){3})|84(?:[08](?:[ ./-]?[0-9]){6}|[17](?:[ ./-]?[0-9]){3}))$", "");
re.test(input);Limits
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué ni que l'indicatif géographique existe : tout 0 suivi de 1 à 9 passe, la liste des indicatifs (01x à 09x, 2 à 4 chiffres) étant publiée par AGCOM.
- Le 0 des fixes doit être CONSERVÉ après +39 ou 0039 : « +39 6 1234 5678 » est rejeté. À l'inverse, un mobile ne prend jamais de 0 : « +39 0320… » est lu comme un fixe.
- Les longueurs suivent le plan notifié à l'UIT : fixe de 6 à 10 chiffres avec le 0 (l'exception à 11 chiffres, indicatif suivi d'un 1, n'est pas reprise), mobile de 9 ou 10 chiffres. Les préfixes 43x, 55x (VoIP), 70x, 89x (surtaxés) et les numéros personnels 178/199 ne sont pas acceptés.
- Une espace, un point, une barre oblique ou un tiret facultatifs sont acceptés entre deux chiffres quelconques ; les parenthèses et les extensions sont rejetées.
Phone numbers for other countries
- Australian phone number
- Belgian phone number
- Brazilian phone number
- Canadian phone number
- Chinese phone number
- Dutch phone number
- French phone number
- German phone number
- Japanese phone number
- Mexican phone number
- Norwegian phone number
- Polish phone number
- South African phone number
- Spanish phone number
- Swedish phone number
- Swiss phone number
- UK phone number
- US phone number
- All phone numbers by country