Regex South African phone number
ICASA states that South African numbers are 10 digits long: the trunk 0 followed by 9 digits, with +27 replacing the 0 from abroad. The two digits after the 0 designate an area code (011 Johannesburg, 021 Cape Town, 031 Durban, 012 Pretoria), a mobile operator (06x, 07x, 08x) or a service (0800 toll-free, 086x, 087x, 09x). The real attempts I read accept any prefix: validator.js's regex accepts '000000000', sent.dm's only refuses 00, and Drupal's accepts numbers starting with 99. Here's a pattern bounding the first two digits, compared against those attempts.
/^(?:(?:\+|00)27[ -]?|0)(?:1[0-8]|2[1-378]|3[1-69]|4[0-9]|5[1346-8]|[67][0-9]|8[0-7]|9[0-2])(?:[ -]?[0-9]){7}$/passes 34/34 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js (en-ZA) — « \d{9} » après 0 ou +27 : « 0000000000 » et « 0199999999 » passent, « 27111234567 » (sans +) aussi ; aucun séparateur (« 011 123 4567 » rejeté) | ^(\+?27|0)\d{9}$ | 18 / 34 | safe |
| sent.dm (guide du fournisseur, formats international et national) — « [1-9]\d{8} » : seul 00 est refusé, « 019… », « 020… », « 088… » passent ; aucun séparateur (« 082 123 4567 » rejeté) | ^0[1-9]\d{8}$|^\+27[1-9]\d{8}$ | 18 / 34 | safe |
| Drupal phone (7.x-1.x, phone.za.inc) — accepte « 27 » sans + devant et n'importe quel préfixe de 2 chiffres (« 099 123 4567 », « 000 123 4567 ») ; « 0027 11 123 4567 » est rejeté ; tolère des espaces multiples après l'indicatif pays | ^((?:\+27|27)|0)[ ]*((\d{2})(-| )?(\d{3})(-| )?(\d{4})|(\d{2})( |-)(\d{7}))$ | 28 / 34 | safe |
Implementation
const re = new RegExp("^(?:(?:\\+|00)27[ -]?|0)(?:1[0-8]|2[1-378]|3[1-69]|4[0-9]|5[1346-8]|[67][0-9]|8[0-7]|9[0-2])(?:[ -]?[0-9]){7}$", "");
re.test(input);Limits
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Les préfixes de 2 chiffres suivent libphonenumber ; le texte des National Numbering Plan Regulations 2016 de l'ICASA, qui fait foi pour les blocs attribués, n'a pas été relu (seule la page « Numbering » l'a été).
- La longueur de 10 chiffres avec le 0 est celle de l'ICASA ; les numéros de 14 chiffres (machine à machine) et les codes courts (moins de 10 chiffres) sont rejetés. Les préfixes 088, 089 et 91x-99x sont rejetés ; 09 n'est accepté que pour 090 à 092.
- Après +27 ou 0027, le 0 de tronc ne doit pas être gardé : « +27 011… » est rejeté.
- Une espace ou un tiret facultatifs sont acceptés entre deux chiffres quelconques ; les parenthèses, points et extensions sont rejetés.
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
- Italian phone number
- Japanese phone number
- Mexican phone number
- Norwegian phone number
- Polish phone number
- Spanish phone number
- Swedish phone number
- Swiss phone number
- UK phone number
- US phone number
- All phone numbers by country