Tutorial de expresii regulate în preg_match()
6Nota editorului : Acest articol a fost scris de crs12decoder pentru RST.
<?php $string = "eu cghjb asd gigiigj@yahoo.com si asda"; $pattern = '/cgh/'; preg_match($pattern, $string, $return); print_r($return); ?>
$variabila reprezintă textul din care extragem informaţii după expresiile regulate.
$pattern reprezintă între conţinând expresiile regulate. Neapărat expresiile se scriu formă linii oblice de mai /[expresie]/.
Scriptul de sus va returna ca cgh dovadă că a în fost găsit string steluţa.
Simbolul *
<?php $string = "eu cuuuuub asd gigiigj@yahoo.com si asda"; $pattern = '/cu*/'; preg_match($pattern, $string, $return); print_r($return); ?>
Script-ul va afişa „cuuuuu”.
Prin steluţa, se preiau părţile care încep cu caracterul „c” şi continuă cu zero sau mai multe caractere „u”.
Asemănător este şi simbolul plus +
Singura diferenţă este ca textul preluat trebuie să aibă cel puţin un caracter u după caracterul iniţial „c”.
Semnul întrebării – ?
Ne spune că pot să fie caractere u după caracterul iniţial c sau pot să lipsească.
Expresii din paranteze pătrate
Ţin locul anumitor caractere.
<?php $string = "eu jksdfb asd gigiigj@yahoo.com si asda"; $pattern = '/j[a-z]/'; preg_match($pattern, $string, $return); print_r($return); ?>
În pattern avem expresia „j[a-z]”.
Deci se caută string-uri care încep cu litera j şi continuă cu orice altă literă (una singură).
În script-ul de mai sus se va afişa „jk”. Asta pentru ca în string avem „jksdfb”. Începe cu j şi să se mai afişeze încă o literă [a-z] după j în cazul în care această există.
Dacă dorim să preluăm tot cuvântul „jksdfb” folosim expresia „j[a-z]*”.
Dacă o luăm logic, cerem să ni se afişeze ceva care începe cu literă j, şi continuă cu orice altă literă de la a la z. Expresia se opreşte la spaţiul dintre cuvinte deoarece acesta nu este cuprins în [a-z].
Expresiile din paranteze pătrate sunt case sensitive. De exemplu dacă în stringul nostru ar fi „jksDfb”. S-ar afişa doar „jks” deoarece D nu este în [a-z] ci este cuprins în [A-Z].
Pentru a fi afişat întregul cuvânt „jksDfb” punem expresia de forma „j[a-za-Z]*”. Aceasta înseamnă că poate continua cu oricâte caractere cuprinse atât în [a-z] cât şi în [A-Z].
Pentru numere punem la fel condiţia [0-9].
Dacă avem textul „jk2sDfb”, fără condiţia [0-9] ar fi preluat doar „jk”. Oprindu-se la „2”.
Pentru această expresia arată de forma „j[a-za-Z0-9]*”.
Caractere multiple
Pentru caractere multiple scriem numărul tipului de caractere în acolade { }.
Spre exemplu.
Având string-ul „daaa”.
Folosim expresia „da{3}” pentru a marca faptul că dorim părţile care încep cu literă d şi continuă cu exact 3 litere de „a”.
De asemenea putem folosi „da{2,4}” pentru a marca faptul că dorim părţile care încep cu literă d şi continuă cu 2,3,4 (între două sau patru) litere de a.
Sau putem folosi „da{2,}” pentru a marca faptul că dorim să aibă 2 sau mai multe litere de „a”.
Ca demonstraţie practică putem folosi expresiile regulate să extragem e-mail-uri dintr-un string.
<?php $string = "eu cghjb asd gig_iigj@yahoo.com si asda"; $pattern = '/[a-zA-Z0-9-_.]+@[a-zA-Z0-9]+.[a-zA-z]{2,4}/'; preg_match($pattern, $string, $return); print_r($return); ?>
Observând pattern-ul am cerut aşa:
String-uri care încep cu orice literă cuprinsă între a-z sau A-Z sau orice număr de la 0 la 9 Sau mai pot conţine simbolul minus „-” sau simbolul underline „_” sau punct „.”
[a-za-Z0-9-_.]
De asemenea simbolul plus + adăugat după „[a-za-Z0-9-_.]” Spune ca poate continuă cu cel puţin încă o literă cuprinsă între a-za-Z0-9 sau „-” , „_” , „.”. DAR va avea la un moment dat un simbol „@” urmat de caractere cuprinse între a-z, A-Z sau 0-9
@[a-za-Z0-9]+
Şi în continuare trebuie să conţină şi un punct „.” urmat de 2, 3 sau 4 caractere cuprinse între [a-z], [A-Z].
Prin urmare. La e-mail-ul: gig_iigj@yahoo.com şi expresia „[a-za-Z0-9-_.]+@[a-za-Z0-9]+.[a-za-z]{2,4}”
Expresia: [a-za-Z0-9-_.]+ Ţine loc de „gig_iigj”
Expresia: „@” Este chiar „@”
Expresia: [a-za-Z0-9]+ Reprezintă „yahoo”.
Expresia: „.” este chiar punctul de la .com spre exemplu
Expresia: [a-za-z]{2,4} reprezintă com din „.com” Care poate fi „.info” sau „.uk” de aceea trebuie să fie la un range de caractere de minim 2 şi maxim 4.
Mai există şi domenii cu extensii duble . Cum ar fi .co.uk sau .us.com aşa că puteţi folosi expresia [a-za-z.]{2,6}
http://gskinner.com/RegExr/ un tool misto, poate nu il stiu unii, eu asta il folosesc.
Povestea este mult, mult, mult mai lunga.
Recomand: http://www.regular-expressions.info/
„The official standard is known as RFC 2822. It describes the syntax that valid email addresses must adhere to. You can (but you shouldn’t–read on) implement it with this regular expression:”
(?:[a-z0-9!#$%&’*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&’*+/=?^_`{|}~-]+)*|”(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*”)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Sursa: http://www.regular-expressions.info/email.html
Nu e neaparat ca expresia regulata sa fie intre slashuri (/). Poate fi folosit orice delimitator, cu conditia ca acesta sa fie „escaped” cu un backslash daca apare in expresia regulata. Daca avem multi de / in expresie, e mai comod sa folosim alte delimitatoare, cum ar fi # sau ~. http://www.php.net/manual/en/regexp.reference.delimiters.php
@Nytro: Nu e buna expresia aceea regulata pentru validarea emailului. Aici se gaseste varianta completa: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html 😀
Cred ca site-ul asta e cel mai complet REGex tester: http://regextester.com/ Puteti testa dialecte pentru JavaScript, Preg (PHP) si Ereg + contine si informatii complete si foarte bine structurate referitoare la sintaxa.
expresiile regulate…o tema foarte larga, care necesita mare atentie mai ales pentru programatorii web
Inca nu le-am inteles … trebuie sa ma apuc de studiat mai bine