PHP - E-mail cím valid-e?

PHP - E-mail cím valid-e?
2009-03-20T16:23:29+01:00
2009-03-21T11:55:09+01:00
2022-11-13T00:25:44+01:00
PredMan
Sziasztok!

kicsit összezavarodtam az email-címek ellenőrzésében. Adott két pattern:

1. /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; 2. /^([a-zA-Z0-9_\.\-])+@([a-zA-Z0-9_\-\.])+(\.[a-zA-Z]{2,4})$/;

egyszerüen nem tudom eldönteni, hogy melyik ellenőriz helyesen. Rákerestem google-ban validáló szkriptekre, de mindegyik másképp működik. Van olyan cím, amit az egyik átenged és van, amelyik meg nem.

vegyük példának ezt a mailcímet: nagy.gabor-@gmail.com

ez ugye hibás, mert a mail cím végénél nem lehet kötőjel. Az első változat (amit beszúrtam példakódot) az ki is írja rá, hogy rossz mailcím. Viszont a második pattern meg helyesnek látja. Ugyanígy viselkednek a google találatai, egyiknek ok, a másiknak meg nem ok.

Na most akkor melyik a helyes?

meg ha már erről beszélünk, akkor miért fogadja el mindkettő pattern az olyan mailcímet, ami egy space-el kezdődik? oké levédem trim()-el, de akkor is érdekes... és akkor a .huíííííí -ról még nem is beszéltem

előre is köszönöm!
Mutasd a teljes hozzászólást!
Amelyik átengedi fenti címet, nyilvánvalóan hibás. Kötőjel szerepelhet, de ahogy írtad semmiképpen sem a kukac előtt (amúgy Gmail éppenséggel sehol sem engedi regisztrációnál). A trim() használata nem hiszem, hogy komoly gond lenne, megcsinálhatod a patternt úgy, hogy tolerálja a helyközt, de adatbázisba mentésnél úgy is ki kell szedned, szóval mindegy. Mellesleg az elsőt átalakítva kb. így nézne ki (bár szerintem értelmetlen):

/[ ]*\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/

Egyértelműen látszik, hogy a második engedi be a hibás címet. Így alakíthatod át:

/^([a-zA-Z0-9_\.])+([\-]?[a-zA-Z0-9]+)*@([a-zA-Z0-9_\-\.])+(\.[a-zA-Z]{2,4})$/

Nem próbáltam, de szerintem jó.
Mutasd a teljes hozzászólást!

  • Én az email címet ezzel a fv-el ellenőrzöm:


    function CheckEmail($email) { if(!preg_match('/^[^\s@]+@[a-z0-9\.-]+?\.[a-z]{2,4}$/i', $email)) { return true; } }
    Mutasd a teljes hozzászólást!
  • Az RFC 2822,5321,5322 ... szerint lehet kötőjel bárhol a name részben, space pedig csak a @ mellett nem lehet. De ezek a szabványok szinte követhetetlenek és a szabványok sem tudják követni a valós használatot. És ennek variációját bővíti hogy egyes szolgáltatók nem/naem akarják követni a szabványt vagy éppen azt kibővítik újabb lehetőségekkel.

    Email address - Wikipedia, the free encyclopedia

    Pl. Ez az RFC 2822-es szabványt engedi:


    (?:[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])+)\])

    De kimondottan felhívják a figyelmet: Ne használd!!

    Jó, mi ? :D :D

    Ez az egyszerűsített RFC 2822:

    if (preg_match('/[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i', $subject)) { # Jó } else { # Nem jó }

    Ez pedig az RFC 2822 speciális Top Level Domain-vizsgálattal:

    if (preg_match('/[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|name|aero|biz|info|mobi|jobs|museum|mobil|me)\b/i', $subject)) { # Jó } else { # Nem jó }

    A mobil-t és az me-t én írtam bele, de bővítheted te is.

    Végeredmény: Saját belátásod szerint dünts.
    :D
    Mutasd a teljes hozzászólást!
  • Egyszer (jónéhány hónapja) összeszedtem az akkor érvényes tld-ket (mert a [A-Z]{2} átenged olyat is, ami nem lehet).
    Így öntöttem regexpbe:
    (?:biz|cat|com|edu|gov|int|mil|net|org|pro|tel|aero|arpa|asia|coop|info|jobs|mobi|name|museum|travel|hrvatska|a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvxyz]|d[ejkmoz]|e[ceghrstu]|f[ijkmorx]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcfikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|o[m]|p[aefghklmnprstwy]|q[a]|r[eosuw]|s[abcdeghijklmnortuvyz]|t[cdfghjklmnoprtvwz]|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amrw])
    Hogy előtte mi van/lehet, engeng elmondta.
    Mutasd a teljes hozzászólást!
  • köszönöm szépen mindenkinek a segítségét!

    nem volt könnyű döntenem, hogy kinek adjam a pontot, mert mindegyikőtök információja hasznos volt a számomra. Dzsoni Vóker válaszolt először, megerősítette, hogy az első pattern a helyes.

    Bár engeng hozzászólását olvasva nehéz lenne megállapítani, hogy melyik a helyes

    Saját belátásod szerint dönts.


    mégegyszer thx all!

    Mutasd a teljes hozzászólást!
  • Dzsoni Vóker válaszolt először, megerősítette, hogy az első pattern a helyes.


    A kötőjeles problémát csakugyan az első kezelte jól, de ha jól a nézem hibás TLD-ket is az engedi be.
    Ahogyan átalakítottam a másodikat az előző üzimben, az nagyjából jó (szerintem). Persze ha száz százalékra akarsz menni, akkor érdemes használni amit kismiska írt.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd