Ce face RegEx în JavaScript, PHP (preg_match) și Python (re)
Deși sintaxa expresiilor regulare este aproape identică între JavaScript, PHP și Python, funcțiile prin care le apelezi și modul în care sunt scrise șirurile diferă de la un limbaj la altul.
În JavaScript, expresiile se scriu direct ca literali între slash-uri (/\d+/g, fără ghilimele). În PHP, funcțiile PCRE (preg_match, preg_match_all, preg_replace) primesc expresia ca șir de caractere cu delimitatori (ex. '/\d+/' sau '~https?://~'). În Python (modulul re), expresia se scrie ca raw string (r"\d+") fără delimitatori /.
Variante și sintaxă asociată
| Expresie / Simbol | Descriere |
|---|---|
Verificare (boolean) |
JS: /re/.test(str) | PHP: preg_match(‘/re/’, $str) === 1 | Python: bool(re.search(r”re”, str)) |
Prima potrivire + grupuri |
JS: str.match(/re/) | PHP: preg_match(‘/re/’, $str, $m) | Python: m = re.search(r”re”, str) |
Toate potrivirile (global) |
JS: […str.matchAll(/re/g)] | PHP: preg_match_all(‘/re/’, $str, $m) | Python: re.findall(r”re”, str) |
Înlocuire (Replace) |
JS: str.replace(/re/g, „$1″) | PHP: preg_replace(‘/re/’, ‘$1’, $str) | Python: re.sub(r”re”, r”\1″, str) |
Împărțire (Split) |
JS: str.split(/re/) | PHP: preg_split(‘/re/’, $str) | Python: re.split(r”re”, str) |
Exemple
Exemplul 1: Același task în JavaScript, PHP și Python: extragerea prețurilor și replace
Vezi în paralel cum se testează, se extrag grupuri și se înlocuiește textul în cele trei limbaje.
// ================= 1. JAVASCRIPT =================
const text = "Produs A: 120 RON, Produs B: 85 RON";
const isValid = /\d+\s*RON/.test(text); // true
const toate = text.match(/\d+(?=\s*RON)/g); // ["120", "85"]
const euro = text.replace(/(\d+)\s*RON/g, "$1 EUR");
// ================= 2. PHP (PCRE) =================
$text = "Produs A: 120 RON, Produs B: 85 RON";
$isValid = (bool) preg_match('/\d+\s*RON/', $text); // true
preg_match_all('/\d+(?=\s*RON)/', $text, $m); // $m[0] = ["120", "85"]
$euro = preg_replace('/(\d+)\s*RON/', '$1 EUR', $text);
// ================= 3. PYTHON 3 (re) ==============
import re
text = "Produs A: 120 RON, Produs B: 85 RON"
is_valid = bool(re.search(r"\d+\s*RON", text)) # True
toate = re.findall(r"\d+(?=\s*RON)", text) # ['120', '85']
euro = re.sub(r"(\d+)\s*RON", r"\1 EUR", text)
Potriviri găsite (Matches)
Rezultatul variabilei euro în toate cele 3 limbaje:
"Produs A: 120 EUR, Produs B: 85 EUR"
Exemplul 2: Alegerea unui delimitator alternativ (~ sau #) în PHP pentru URL-uri și căi
În PHP nu ești obligat să folosești /.../: dacă expresia conține slash-uri /, folosește ~...~ sau #...# ca să nu mai escapezi fiecare \/!
// PHP - cu delimitatorul / trebuie să escapăm fiecare slash:
preg_match('/^https:\/\/www\.dexblog\.ro\/invata\/([a-z0-9-]+)\/$/', $url, $m);
// PHP - cu delimitatorul ~ expresia este mult mai curată:
preg_match('~^https://www\.dexblog\.ro/invata/([a-z0-9-]+)/$~', $url, $m);
Potriviri găsite (Matches)
Ambele expresii sunt 100% echivalente în PHP, dar varianta cu ~...~ evită "leaning toothpick syndrome" (\/\/\/).
Greșeli frecvente
- În Python, diferența dintre
re.match()șire.search():re.match()verifică doar la începutul șirului (ca și cum ar avea^invizibil în față), în timp cere.search()caută oriunde în șir (comportamentul standard din JS și PHP)! - În JavaScript, dacă folosești
str.match(/.../g)cu flag-ulg, metoda returnează doar potrivirile întregi și ignoră grupurile de captură! Pentru a obține și grupurile de captură pentru toate aparițiile în JS, foloseștestr.matchAll(/.../g). - În PHP,
preg_match()returnează1(int) la potrivire,0când nu găsește nimic șifalsela eroare de sintaxă. Verifică cupreg_match(...) === 1în condițiile stricte.
Simboluri și rețete înrudite
Flag-uri RegEx: g, i, m, s, u, x: Modificatori globali care schimbă modul de evaluare a expresiei: căutare multiplă (g), insensibil la majuscule (i), multi-linie (m), Unicode (u).\ (escaparea caracterelor speciale): Anulează rolul special al metacaracterelor RegEx (. + * ? ^ $ ( ) [ ] { } | \) pentru a le căuta ca text literal.(...) (grup de captură): Grupează mai multe elemente într-o singură unitate și salvează (capturează) subșirul potrivit pentru extragere sau înlocuire.(?<nume>...) (grup cu nume): Asociază un nume descriptiv unui grup de captură pentru a accesa valoarea extrasă după cheie, nu doar după număr.