preg_match în PHP

Verifică dacă un text se potrivește cu o expresie regulată și extrage prima potrivire.

Sintaxă
preg_match(string $pattern, string $subject, &$matches = null, int $flags = 0, int $offset = 0): int|false

Ce face preg_match

O expresie regulată (regex) este un șablon care descrie forma unui text: „patru cifre”, „o adresă de email”, „un cuvânt care începe cu majusculă”. preg_match caută prima potrivire a șablonului și returnează 1 dacă o găsește, 0 dacă nu.

Șablonul se scrie între delimitatori, de obicei /.../, urmat de modificatori: i (fără majuscule), u (UTF-8, necesar pentru diacritice). Părțile puse între paranteze sunt salvate separat în $matches.

Elemente uzuale: \d cifră, \w literă, cifră sau _, \s spațiu, . orice caracter, + o dată sau de mai multe ori, * de zero sau mai multe ori, {4} exact de 4 ori, ^ și $ începutul și sfârșitul textului.

Parametri

Parametru Descriere
$pattern Expresia regulată, cu delimitatori, de exemplu '/^\d{4}$/'.
$subject Textul verificat.
$matches Opțional. Variabilă în care primești potrivirea: [0] întreaga potrivire, [1], [2]… grupurile din paranteze.
$flags Opțional. De exemplu PREG_OFFSET_CAPTURE pentru a primi și pozițiile.
$offset Opțional. Poziția (în octeți) de la care începe căutarea.

Ce returnează

1 dacă există potrivire, 0 dacă nu, false dacă șablonul este greșit.

Exemple

Exemplul 1: Validarea unui cod poștal românesc

^ și $ obligă întregul text să aibă exact 6 cifre.

<?php
foreach (["700259", "70025", "7002590", "70O259"] as $cod) {
    echo $cod . ": " . (preg_match('/^\d{6}$/', $cod) ? "valid" : "invalid") . "\n";
}

Rezultat

700259: valid
70025: invalid
7002590: invalid
70O259: invalid

Exemplul 2: Extragerea părților unei date

<?php
$text = "Comanda a fost livrată pe 19.10.2026 la Iași.";

if (preg_match('/(\d{2})\.(\d{2})\.(\d{4})/', $text, $m)) {
    print_r($m);
    echo "Anul: " . $m[3];
}

Rezultat

Array
(
    [0] => 19.10.2026
    [1] => 19
    [2] => 10
    [3] => 2026
)
Anul: 2026

Exemplul 3: Grupuri cu nume și modificatorul u

<?php
$adresa = "Strada Ștefan cel Mare nr. 12";

if (preg_match('/^Strada (?<strada>.+) nr\. (?<numar>\d+)$/u', $adresa, $m)) {
    echo "Strada: " . $m["strada"] . "\n";
    echo "Numărul: " . $m["numar"];
}

Rezultat

Strada: Ștefan cel Mare
Numărul: 12

Greșeli frecvente

  • Scrii șablonul între ghilimele duble și \d sau $ sunt interpretate de PHP. Scrie expresiile regulate între ghilimele simple: '/^\d+$/'.
  • Uiți delimitatorii: preg_match('\d+', ...) dă avertismentul Delimiter must not be alphanumeric.
  • Lucrezi cu diacritice fără modificatorul u. Fără el, . și \w văd octeți, nu litere.

Comenzi înrudite

  • preg_match_all: Găsește toate potrivirile unei expresii regulate într-un text și le pune într-un tablou.
  • preg_replace: Înlocuiește toate potrivirile unei expresii regulate cu alt text.
  • preg_quote: Pune o bară inversă înaintea caracterelor speciale, ca un text să poată fi folosit în siguranță într-o expresie regulată.
  • str_contains: Verifică dacă un text conține alt text. Returnează true sau false.