Ce face Rețetă RegEx: Telefon RO, CNP și IBAN
Aplicațiile de e-commerce, facturare și HR din România au nevoie constant de validarea a trei formate specifice: numărul de telefon românesc (mobil 07xx sau fix 02xx / 03xx, cu sau fără prefixul internațional +40 ori 0040), Codul Numeric Personal (CNP) de 13 cifre și codul bancar IBAN de România (24 de caractere începând cu RO).
Rețetele de mai jos sunt gândite atât pentru validarea strictă a datelor curățate de spații, cât și pentru acceptarea formatării umane cu spații, puncte sau cratime (ex. 0722 123 456 sau RO49 AAAA 1B31 ...).
Variante și sintaxă asociată
| Expresie / Simbol | Descriere |
|---|---|
^(?:\+?40|0040|0) |
Prefixul unui număr de telefon românesc: acceptă +40, 40, 0040 sau 0 național. |
7\d{2}[\s.-]?\d{3}[\s.-]?\d{3} |
Număr mobil RO (începe cu 7) cu separatori opționali (spațiu, punct, cratimă). |
[237]\d{2} |
Include atât numerele mobile (07xx), cât și cele fixe (02xx și 03xx). |
^[1-9]\d{2}(0[1-9]|1[0-2])... |
Structura CNP-ului: S (sex/secol 1-9), AA (an), LL (lună 01-12), ZZ (zi 01-31), JJ (județ), NNN, C. |
^RO\d{2}[A-Z]{4}[A-Z0-9]{16}$ |
Formatul oficial al unui IBAN românesc (24 de caractere alfanumerice). |
Exemple
Exemplul 1: Validarea numerelor de telefon din România (mobil și fix)
Acceptă formatele uzuale 0722123456, 0722 123 456, 0722-123-456, +40722123456 și numere fixe 021/031.
// Doar mobil România:
$reMobil = '/^(?:\+?40|0040|0)\s*7\d{2}[\s.-]?\d{3}[\s.-]?\d{3}$/';
// Mobil + Fix România (02xx, 03xx, 07xx):
$reTelefonRO = '/^(?:\+?40|0040|0)\s*[237]\d{2}[\s.-]?\d{3}[\s.-]?\d{3}$/';
Potriviri găsite (Matches)
"0722123456" -> VALID (mobil)
"0744 123 456" -> VALID (mobil cu spații)
"+40 722-123-456" -> VALID (mobil cu prefix +40)
"021 312 4567" -> VALID pe $reTelefonRO (fix București)
"0800 123 456" -> INVALID pe $reMobil
Exemplul 2: Validarea sintactică a CNP-ului și a contului IBAN de România
Verificăm structura calendaristică și codul de județ din CNP (13 cifre), respectiv cele 24 de caractere ale unui IBAN RO.
// CNP (13 cifre: S + AA + LL(01-12) + ZZ(01-31) + JJ(01-52,70,80,99) + NNN + C):
$reCNP = '/^[1-9]\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])(?:0[1-9]|[1-4]\d|5[0-2]|70|80|99)\d{4}$/';
// IBAN România (fără spații: RO + 2 cifre control + 4 litere bancă + 16 caractere cont):
$reIBAN = '/^RO\d{2}[A-Z]{4}[A-Z0-9]{16}$/i';
Potriviri găsite (Matches)
CNP "1900515400123" -> VALID sintactic (sex 1, an 90, luna 05, zi 15, județ 40)
CNP "0901345990123" -> INVALID (începe cu 0, luna 13, ziua 45)
IBAN "RO49AAAA1B31007593840000" -> VALID (24 caractere: RO + 2 cifre + 4 litere + 16 alfanum)
Greșeli frecvente
- Refuzarea spațiilor în inputul de telefon sau IBAN: utilizatorii copiază frecvent IBAN-ul grupat câte 4 caractere (
RO49 AAAA 1B31...). Cea mai bună practică în UX este să elimini mai întâi spațiile cupreg_replace('/\s+/', '', $input)și apoi să aplici expresia de validare. - Considerarea RegEx-ului ca fiind suficient 100% pentru CNP sau IBAN: expresia regulară verifică impecabil formatul și lungimea, dar pentru validare completă în producție trebuie verificată și cifra de control (ultima cifră din CNP cu constanta
279146358279, respectiv modulo 97 pentru IBAN).
Simboluri și rețete înrudite
Rețetă RegEx: Validare Email și URL: Expresii regulare practice și sigure pentru validarea și extragerea adreselor de email și a linkurilor HTTP/HTTPS.Rețetă RegEx: Parolă puternică, cod poștal și IP: Expresii regulare pentru verificarea complexității unei parole (cu lookahead), a codurilor poștale de 6 cifre și a adreselor IPv4.\d și \D (cifre): Scurtătură pentru orice cifră zecimală de la 0 la 9 (\d) sau orice caracter care nu este cifră (\D).{n}, {n,} și {n,m} (număr exact de repetiții): Controlează precis de câte ori trebuie să se repete un caracter sau un grup: exact n, minim n sau între n și m ori.