Regex Spanish phone number
Spain has a closed 9-digit numbering plan: you always dial all 9 digits, with no trunk 0, so +34 612 345 678 and 612 345 678 are the same number. Mobiles start with 6 or 7, landlines with 8 or 9. validator.js's mobile regex writes '[6|7]': the pipe is a literal character, so '|12345678' passes. A regex from a personal repository accepts '000 000 000' and any international prefix. The spain-phone package does not handle +34 at all. Here's a pattern requiring the first digit and the +34 or 0034 prefix, compared against those attempts.
/^(?:(?:\+|00)34 ?)?[6-9](?: ?[0-9]){8}$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js (es-ES) — mobiles seulement : « [6|7] » contient un tube littéral (« |12345678 » passe) ; aucune espace : « 612 345 678 » et « +34 612 345 678 » rejetés ; rejette tout fixe | ^(\+?34)?[6|7]\d{8}$ | 19 / 24 | safe |
| spain-phone (npm, isFixed || isMobile) — pas de préfixe +34 ni 0034 ; le préfixe 5 (« 512345678 ») est accepté comme fixe ; ni espaces ni tirets sans normalisation préalable | ^[589]{1}(\d){8}$|^[67]{1}(\d){8}$ | 18 / 24 | safe |
| Jkutkut/Regex (README, dépôt personnel) — n'importe quels 9 chiffres (« 000 000 000 », « 512345678 ») et n'importe quel indicatif (« +44 612345678 », « +999 123 456 789 ») passent | ^(\+\d{2,3})? ?\d{3} ?(\d{3} ?\d{3}|\d{2} ?\d{2} ?\d{2})$ | 19 / 24 | safe |
Implementation
const re = new RegExp("^(?:(?:\\+|00)34 ?)?[6-9](?: ?[0-9]){8}$", "");
re.test(input);Limits
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Le motif accepte tout numéro à 9 chiffres commençant par 6 à 9, y compris des plages non attribuées ou spéciales (« 800 123 456 » gratuit, « 700 123 456 » personnel, que libphonenumber ne classe pas comme mobile).
- Le plan est fermé à 9 chiffres : il n'y a pas de 0 de tronc, donc « 0612345678 » et « +34 0612345678 » sont rejetés. L'indicatif +34 ou 0034 est facultatif, avec une espace facultative.
- Les espaces facultatives entre les chiffres sont une tolérance de saisie, pas une règle du plan : « 6 1 2 3 4 5 6 7 8 » passe. Normalisez le numéro en 9 chiffres avant stockage.
- Aucune plage fictive officielle n'a été trouvée pour l'Espagne ; les exemples viennent de libphonenumber et de la suite de tests de validator.js.