8 Expresii regulate pe care trebuie să le cunoașteți

Expresiile regulate sunt o limbă proprie. Când învățați un nou limbaj de programare, ei sunt acest mic sub-limbaj care nu are sens la prima vedere. De multe ori trebuie să citiți un tutorial, un articol sau o carte doar pentru a înțelege modelul "simplu" descris. Astăzi, vom examina opt expresii regulate pe care ar trebui să le cunoașteți pentru următorul proiect de codificare.

Înainte de a începe, vă recomandăm să consultați câteva dintre aplicațiile regex de pe Envato Market, cum ar fi:

RegEx Extractor

Puteți extrage e-mailuri, proxy-uri, adrese IP, numere de telefon, adrese, etichete HTML, adrese URL, date, etc. Introduceți doar unul sau mai multe expresii regulate și adrese URL sursă și începeți procesul.

Extrageți, răzuiți, analizați, recoltați.

Exemple de utilizare

  • Extrageți e-mailurile dintr-o veche agendă CSV.
  • Extrageți sursele de imagine din fișierele HTML.
  • Extrageți proxy-urile din site-urile web.
  • Extrageți rezultatele de la adresa URL de la Google.

PHP Tester de expresii regulate

  1. Tester de reglare rapidă
  2. Bazate pe Ajax
  3. jQuery etc nu sunt necesare.
  4. Nu este necesară nicio bază de date
  5. Publicitate gata

MyRegExp

Acest element este un constructor PHP RegEx, care vă ajută să construiți expresii regulate într-o sintaxă extensibilă PHP. Poti:

  1. Construiți expresii regulate cu o sintaxă ușoară PHP
  2. Validați șiruri de caractere cu RegEx construit
  3. Construiți RegEx-urile și le obțineți
  4. Aplicați preg_match la un RegEx
  5. Înlocuiți un șir cu ajutorul RegEx-ului construit

Totul într-o sintaxă PHP. Nu mai există capete rupte care încearcă să facă RegEx de bază sau complexe!


Informații de bază privind expresiile regulate

Aceasta este ceea ce Wikipedia are de spus despre ei:

În calcul, expresiile regulate oferă un mijloc concis și flexibil pentru identificarea șirurilor de text de interes, cum ar fi caracterele, cuvintele sau tiparele de caractere. Expresiile regulate (abreviate ca regex sau regexp, cu formulare multiple, regexes, regexps sau regexen) sunt scrise într-un limbaj formal care poate fi interpretat de un procesor de expresie obișnuit, un program care servește fie ca generator de parser, fie că examinează textul, care corespund specificațiilor furnizate.

Acum, asta nu-mi spune prea multe despre modelele reale. Regexurile pe care le voi trece astăzi conțin caractere precum \ w, \ s, \ 1 și multe altele care reprezintă ceva complet diferit de ceea ce arată.

Dacă doriți să aflați ceva despre expresiile regulate înainte de a continua să citiți acest articol, vă sugerăm să vizionați seria serială Regular Expressions for Dummies.

Cele opt expresii regulate pe care le vom trece astăzi vă vor permite să potriviți un nume de utilizator, o parolă, o adresă de e-mail, o valoare hex (cum ar fi #fff sau # 000), slug, URL, adresa IP și o etichetă HTML. Pe măsură ce lista coboară, expresiile regulate devin din ce în ce mai confuze. Imaginile fiecărui regex la început sunt ușor de urmărit, dar ultimele patru sunt mai ușor de înțeles prin citirea explicațiilor.

Lucrul cheie pe care trebuie să-l amintiți despre expresiile obișnuite este că ele sunt citite aproape în față și înapoi în același timp. Această teză va avea mai multă sens atunci când vorbim despre potrivirea etichetelor HTML.

Notă: Delimitatorii utilizați în expresiile regulate sunt slash-urile "/". Fiecare model începe și se termină cu un delimiter. Dacă apare o slash înapoi într-un regex, trebuie să scăpăm cu un backslash: "\ /".


1. Compararea unui nume de utilizator

Model:

/ ^ [A-Z0-9 _-] 3,16 $ /

Descriere:

Începem prin a spune parserului să găsească începutul șirului (^), urmat de orice literă mică (a-z), număr (0-9), subliniere sau o cratimă. În continuare, 3,16 vă asigură că există cel puțin 3 din aceste caractere, dar nu mai mult de 16. În final, dorim ca sfârșitul șirului ($).

String care corespunde:

mi-us3r_n4m3

String care nu se potrivește:

th1s1s-wayt00_l0ngt0beausername (prea lung)


2. Matching a Password

Model:

/ ^ [A-Z0-9 _-] 6,18 $ /

Descriere:

Potrivirea unei parole este foarte asemănătoare cu potrivirea unui nume de utilizator. Singura diferență este că, în loc de 3 până la 16 litere, numere, sublințiri sau cratimă, dorim între 6 și 18 dintre ei (6,18).

String care corespunde:

myp4ssw0rd

String care nu se potrivește:

mypa $$ w0rd (conține un semn de dolar)


3. Matching a Hex Value

Model:

? / ^ # ([A-f0-9] 6 | [a-f0-9] 3) $ /

Descriere:

Începem prin a spune parserului să găsească începutul șirului (^). Apoi, un semn numeric este opțional deoarece este urmat de un semn de întrebare. Semnul de întrebare îi spune parserului că caracterul precedent - în acest caz un semn numeric - este opțional, ci să fie "lacom" și să îl capteze dacă este acolo. Apoi, în interiorul primului grup (primul grup de paranteze), putem avea două situații diferite. Prima este o literă mică între a și f sau un număr de șase ori. Bara verticală ne spune că putem avea și trei litere mici între a și f sau numere. În cele din urmă, dorim sfârșitul șirului ($).

Motivul pentru care am introdus cele șase caractere înainte este că parserul va captura o valoare hex ca #ffffff. Dacă aș fi inversat-o astfel încât cele trei personaje să vină mai întâi, parserul ar lua doar #fff și nu celelalte trei f.

String care corespunde:

# a3c113

String care nu se potrivește:

# 4d82h4 (conține litera h)


4. Matching a Slug

Model:

/ ^ [A-Z0-9 -] + $ /

Descriere:

Veți folosi acest regex dacă vreodată trebuie să lucrați cu mod_rewrite și destul de URL-uri. Începem prin a spune parserului să găsească începutul șirului (^), urmat de unul sau mai multe (semnul plus) litere, numere sau cratime. În cele din urmă, dorim sfârșitul șirului ($).

String care corespunde:

mi-titlu-aici

String care nu se potrivește:

my_title_here (conține underscore)


5. Compararea unui e-mail

Model:

/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]2,6)$/

Descriere:

Începem prin a spune parserului să găsească începutul șirului (^). În interiorul primului grup, potrivim una sau mai multe litere mici, numere, sublințiri, puncte sau cratime. Am scăpat de punct deoarece un punct care nu a scăpat înseamnă orice caracter. Imediat după aceea, trebuie să existe un semn. Următorul este numele de domeniu care trebuie să fie: una sau mai multe litere mici, numere, subliniere, puncte sau cratime. Apoi un alt punct (escaped), cu extensia fiind de două până la șase litere sau puncte. Am 2 la 6 din cauza TLD-urilor specifice țării (.ny.us sau .co.uk). În cele din urmă, dorim sfârșitul șirului ($).

String care corespunde:

[email protected]

String care nu se potrivește:

[email protected] (TLD este prea lung)


6. Se potrivește o adresă URL

Model:

/ ^ (https?:\/\/)?([\da-z\.-]+)\.([az\.]2,6)([\/\w \ .-] *) * \ /? $ /

Descriere:

Acest regex este aproape ca a lua partea finală a regelui de mai sus, pălmuind între "http: //" și unele structuri de fișiere la sfârșitul anului. Sună mult mai simplu decât este. Pentru a începe, căutăm începutul liniei cu carul.

Primul grup de capturare este o opțiune. Permite ca URL-ul să înceapă cu "http: //", "https: //" sau nici una dintre ele. Am un semn de întrebare după s pentru a permite URL-uri care au http sau https. Pentru a face întregul grup opțional, tocmai am adăugat un semn de întrebare la sfârșitul acestuia.

Următorul este numele de domeniu: unul sau mai multe numere, litere, puncte sau hip-uri urmate de un alt punct, apoi de două până la șase litere sau puncte. Următoarea secțiune este fișierele și directoarele opționale. În interiorul grupului, dorim să potrivim orice număr de tăieturi, litere, numere, subliniere, spații, puncte sau cratime. Apoi spunem că acest grup poate fi comparat de câte ori ne dorim. Destul de mult acest lucru permite ca mai multe directoare să fie potrivite împreună cu un fișier la sfârșitul anului. Am folosit steaua în locul semnului de întrebare, deoarece steaua spune zero sau mai mult, nu zero sau unul. Dacă acolo ar fi folosit un semn de întrebare, ar fi posibil să se potrivească doar un singur fișier / director.

Apoi se potrivesc o bară de tracțiune, dar poate fi opțională. În cele din urmă terminăm cu sfârșitul liniei.

String care corespunde:

http://net.tutsplus.com/about

String care nu se potrivește:

http://google.com/some/file!.html (conține un semn de exclamare)


7. Compararea unei adrese IP

Model:

/ ^ (? :( ?: 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]) $ /

Descriere:

Acum, nu o să mint, nu am scris această regex; Am luat-o de aici. Acum, asta nu inseamna ca nu-l pot rupe de caracter caracteristic.

Primul grup de capturare nu este într-adevăr un grup capturat, deoarece

?:

a fost plasat în interiorul căruia îi spune parserului să nu captureze acest grup (mai multe despre acesta în ultimul regex). De asemenea, dorim ca acest grup non-capturat să fie repetat de trei ori - 3 la sfârșitul grupului. Acest grup conține un alt grup, un subgrup și un punct literal. Parserul caută o potrivire în subgrup, apoi un punct pentru a merge mai departe.

Subgrupul este, de asemenea, un alt grup non-captură. Este doar o mulțime de seturi de caractere (lucruri din paranteze): șirul "25" urmat de un număr între 0 și 5; sau șirul "2" și un număr între 0 și 4 și orice număr; sau un zero opțional sau unul urmat de două numere, al doilea fiind opțional.

După ce ne potrivim cu trei, e în următorul grup care nu captează. Acesta vrea: șirul "25" urmat de un număr între 0 și 5; sau șirul "2" cu un număr între 0 și 4 și un alt număr la sfârșit; sau un zero opțional sau unul urmat de două numere, al doilea fiind opțional.

Terminăm acest regex confuz cu sfârșitul șirului.

String care corespunde:

73.60.124.136 (nu, nu este adresa mea IP: P)

String care nu se potrivește:

256.60.124.136 (primul grup trebuie să fie "25" și un număr între zero și cinci)


8. Se potrivește o etichetă HTML

Model:

/ ^<([a-z]+)([^<]+)*(?:>(. *)<\/\1>| \ S + \ />) $ /

Descriere:

Una dintre cele mai utile regexe de pe listă. Se potrivește cu orice etichetă HTML cu conținutul din interior. Ca de obicei, începem cu începutul liniei.

Mai întâi vine numele etichetei. Trebuie să fie una sau mai multe scrisori lungi. Acesta este primul grup de captare, acesta vine la îndemână atunci când trebuie să luăm eticheta de închidere. Următorul lucru sunt atributele etichetei. Acesta este orice caracter, dar este mai mare decât semnul (>). Deoarece acest lucru este opțional, dar vreau să potrivesc mai mult de un caracter, este folosit steaua. Semnul plus alcătuieste atributul și valoarea, iar steaua spune cât de multe atribute doriți.

Apoi vine cel de-al treilea grup non-captură. În interior, va conține fie un semn mai mare decât un anumit conținut, cât și o etichetă de închidere; sau unele spații, un slash înainte și un semn mai mare. Prima opțiune caută un semn mai mare decât cel urmat de orice număr de caractere și eticheta de închidere. \ 1 este utilizat care reprezintă conținutul capturat în primul grup de capturare. În acest caz era numele etichetei. Acum, dacă aceasta nu a putut fi potrivită, vrem să căutăm o etichetă de închidere automată (ca o etichetă img, br sau hr). Trebuie să aibă unul sau mai multe spații urmate de "/>".

Regexul se termină cu sfârșitul liniei.

String care corespunde:

Nettuts "> http://net.tutsplus.com/"> Nettuts+

String care nu se potrivește:

My image> (atributele nu pot conține mai mult decât semne)


Concluzie

Sper că ați înțeles puțin mai bine ideile din spatele expresiilor regulate. Sperăm că veți folosi aceste regexe în proiecte viitoare! De multe ori nu va trebui să descifrați un caracter regex prin caracter, dar uneori, dacă faceți acest lucru, vă ajută să învățați. Amintiți-vă, nu vă temeți de expresii regulate, s-ar putea să nu păreați, dar vă fac viața mult mai ușoară. Doar încercați să scoateți numele unei etichete dintr-un șir fără expresii regulate!

Urmăriți-ne pe Twitter sau abonați-vă la feed-ul RSS NETTUTS pentru mai multe tutoriale și articole zilnice de dezvoltare web. Și verificați câteva din acele aplicații regex pe Envato Market.