Dacă ai lucrat vreodată cu prelucrarea textului în PHP, sunt șanse mari să fi întâlnit funcția preg_replace()
. Este un instrument incredibil de puternic și versatil, o adevărată mașinărie elvețiană pentru manipularea șirurilor de caractere. Însă, la fel ca orice unealtă de mare precizie, necesită înțelegere și respect pentru a fi folosită corect și eficient. Acest ghid complet te va purta prin toate aspectele funcției, de la bazele sale până la utilizări avansate, oferind exemple practice și sfaturi esențiale.
Pregătește-te să descoperi cum poți transforma, curăța și valida date cu o precizie uimitoare, stăpânind arta expresiilor regulate (regex) prin prisma lui preg_replace()
. Hai să începem!
Ce este preg_replace()
și de ce este atât de importantă?
Pe scurt, preg_replace()
este o funcție PHP care efectuează o înlocuire a șirurilor de caractere folosind expresii regulate. Spre deosebire de funcții mai simple precum str_replace()
, care caută și înlocuiește exact șiruri de caractere, preg_replace()
utilizează pattern-uri complexe pentru a identifica și manipula fragmente de text. Această capacitate o face indispensabilă pentru sarcini precum:
- Curățarea intrărilor utilizatorilor (eliminarea scripturilor malitioase, formatarea textului).
- Extragerea și reformatarea datelor (numere de telefon, adrese de e-mail, date).
- Generarea de URL-uri „friendly” (slug-uri).
- Manipularea avansată a conținutului HTML sau XML.
- Validarea datelor într-un format specific.
Sintaxa funcției preg_replace()
Forma de bază a funcției este următoarea:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
Să descompunem fiecare parametru:
$pattern
(mixt): Acesta este modelul pe care vrei să-l cauți. Poate fi un șir de caractere (o singură expresie regulată) sau o matrice de șiruri de caractere (mai multe expresii regulate). Important este că trebuie să fie o expresie regulată PCRE (Perl Compatible Regular Expressions), delimitată de caractere specifice (ex:/pattern/
).$replacement
(mixt): Acesta este șirul sau șirurile de caractere cu care vei înlocui potrivirile găsite. La fel ca$pattern
, poate fi un șir de caractere sau o matrice. Dacă$pattern
este o matrice și$replacement
este un șir, toate potrivirile vor fi înlocuite cu același șir. Dacă ambele sunt matrici, elementele sunt folosite în perechi (primul pattern cu primul replacement etc.). Poate conține referințe înapoi (backreferences) precum$1
,$2
sau1
,2
, care se referă la grupurile de captură din$pattern
.$subject
(mixt): Acesta este șirul sau matricea de șiruri de caractere în care se va efectua căutarea și înlocuirea.$limit
(int, opțional): Numărul maxim de potriviri pe care dorești să le înlocuiești pentru fiecare pattern. Valoarea implicită este-1
, ceea ce înseamnă că toate potrivirile vor fi înlocuite.&$count
(int, opțional): Dacă este specificat, această variabilă va fi populată cu numărul total de înlocuiri efectuate.
Regex: Inima și sufletul funcției preg_replace()
Pentru a stăpâni preg_replace()
, trebuie să înțelegi expresiile regulate. Ele sunt limbajul cu care „vorbești” acestei funcții. O expresie regulată este, în esență, un șir de caractere care definește un model de căutare. Iată câteva elemente fundamentale:
- Delimitatori: Fiecare expresie regulată trebuie să înceapă și să se termine cu un delimitator (ex:
/
,#
,~
). De exemplu,/exemplu/
. - Meta-caractere: Acestea au semnificații speciale:
.
(punct): Orice caracter, cu excepția newline.*
(asterisc): Zero sau mai multe apariții ale caracterului/grupului precedent.+
(plus): Una sau mai multe apariții.?
(semnul întrebării): Zero sau o apariție.[abc]
: Orice caracter dintrea
,b
sauc
.[^abc]
: Orice caracter, cu excepțiaa
,b
sauc
.(a|b)
: Fiea
, fieb
.^
(circumflex): Începutul șirului.$
(dolar): Sfârșitul șirului.d
: Orice cifră (echivalent cu[0-9]
).D
: Orice caracter care nu este cifră.w
: Orice caracter alfanumeric (litere, cifre, underscore).W
: Orice caracter non-alfanumeric.s
: Orice spațiu alb (space, tab, newline).S
: Orice caracter non-spațiu alb.
- Modificatori: Sunt adăugați după delimitatorul final și modifică comportamentul căutării:
i
(case-insensitive): Ignoră diferența dintre majuscule și minuscule.m
(multiline): Tratarea șirului ca mai multe linii.s
(dotall): Punctul (.
) potrivește și caracterele newline.u
(unicode): Asigură potrivirea corectă a caracterelor Unicode.
Înțelegerea acestor concepte este fundamentală. Fără ele, preg_replace()
este doar o funcție oarecare; cu ele, devine un super-instrument.
Exemple practice și cazuri de utilizare
Exemplul 1: Substituție simplă pentru crearea de „slug-uri”
Să presupunem că vrei să transformi un titlu într-un URL „friendly” (slug). Ai nevoie să înlocuiești spațiile și caracterele speciale cu cratime și să elimini caracterele nepermise.
$titlu = "Ghid Complet: Stăpânește preg_replace() în PHP!";
$slug = strtolower($titlu); // Începem cu litere mici
// 1. Înlocuim caracterele non-alfanumerice (cu excepția spațiilor și cratimelor) cu nimic
$slug = preg_replace('/[^a-z0-9s-]/', '', $slug);
// 2. Înlocuim spațiile cu cratime
$slug = preg_replace('/s+/', '-', $slug);
// 3. Eliminăm cratimele multiple (dacă au rămas)
$slug = preg_replace('/-+/', '-', $slug);
// 4. Eliminăm cratimele de la început sau sfârșit
$slug = trim($slug, '-');
echo $slug; // Output: ghid-complet-stapaneste-preg-replace-in-php
💡 Observă cum am combinat mai multe apeluri preg_replace()
pentru a rafina rezultatul, demonstrând flexibilitatea sa.
Exemplul 2: Extracția și reformatarea datelor cu grupuri de captură
Imaginați-vă că aveți un text cu numere de telefon de format american (AAA-BBB-CCCC) și vreți să le transformați în format internațional (+1 (AAA) BBB-CCCC).
$text = "Contactează-mă la 123-456-7890 sau la 987-654-3210 pentru detalii.";
$pattern = '/(d{3})-(d{3})-(d{4})/'; // Trei grupuri de captură: $1, $2, $3
$replacement = '+1 ($1) $2-$3';
$text_formatat = preg_replace($pattern, $replacement, $text);
echo $text_formatat; // Output: Contactează-mă la +1 (123) 456-7890 sau la +1 (987) 654-3210 pentru detalii.
Aici, $1
, $2
și $3
sunt referințe înapoi la conținutul capturat de fiecare grup de paranteze din pattern.
Exemplul 3: Curățarea intrărilor utilizatorilor (sanitizare HTML)
Eliminarea tag-urilor HTML periculoase dintr-un input este o sarcină comună de securitate.
$input_utilizator = "Acesta este un text cu <script>alert('XSS!');</script> și <b>bold</b>.";
$pattern = '/<script.*?</script>/is'; // Potrivește tag-urile