[ Zidar @ 26.06.2013. 15:28 ] @
Potrebno je napisati CHECK CONSTRAINT za proveru email adrese. Tabela za primer:

Code:

CREATE TABLE Poruke
(
Email varchar(255) NOT NULL PRIMARY KEY
)


U jeziku koji korstite, napisite ekvivalent ove naredbe:
Code:

ALTER TABLE Poruke
ADD CONSTRAINT CK_email CHECK (Email LIKE '%@%.%')

Ova verzija pokriva uslov:
"Email adresa mora da sadrzi znakove '@' i '.' u". To naravno nije dovoljno.
Kad posaljete resenje, prilozite i dodatne uslove, na primer "Znakovi '@' i '.' ne smeju da budu jedno do drugoga"

Test deck (nije kompletan, dodajte sve cega se setite):
Code:

SELECT '[email protected]' -- trebe da prodje
UNION
SELECT '[email protected]' -- trebe da prodje
UNION
SELECT '[email protected]' -- trebe da prodje
UNION
SELECT 'Paja [email protected]' -- ne sme da prodje
UNION
SELECT 'Paja [email protected].' -- ne sme da prodje
UNION
SELECT 'Paja [email protected]' -- ne sme da prodje
UNION
SELECT '@.sr' -- ne sme da prodje
UNION
SELECT '@' -- ne sme da prodje
UNION
SELECT '.' -- ne sme da prodje
UNION
SELECT '[email protected]'  -- ne sme da prodje
UNION
SELECT '@[email protected]'  -- ne sme da prodje



Srecno
[ djoka_l @ 26.06.2013. 17:52 ] @
Uh ne bih hteo da kvarim zabavu, ali Oracle ima REGEXP_LIKE funkciju koja, uzgred, može da se koristi u CHECK klauzuli...

http://docs.oracle.com/cd/B193...4251/adfns_regexp.htm#CHDBCCDJ

REGEX za validnu email adresu (RFC 2822):
(?:[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])+)\])

Pogledati, na primer i http://www.regular-expressions.info/email.html


[Ovu poruku je menjao djoka_l dana 26.06.2013. u 19:04 GMT+1]
[ brzak @ 26.06.2013. 18:15 ] @
regexp za postgresql

ALTER TABLE Poruke
ADD CONSTRAINT CK_email CHECK (Email ~* '^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{1,})$');
[ Zidar @ 26.06.2013. 20:11 ] @
Zahvaljujem na prvom resenju. Lepo je sto ORACLE ima Regex I to je validno resenje. Ko nema Regex, mora da se muci kroz SQL. A i ko ima Regex, mozda nije znao za njega, ili nije umeo da ga upotrebi. U svakom slucaju, zahvaljujemo na resenju.

Ima li nesto za MS SQL ili Access, MySQL? Nije vazno da bude elegantno, niti kompletno. Mozda od nekoliko nekompletnih resenja napravimo jedno koje je kompletno. Zato smo trazili komenta - sta sve pokrivamonasim resenje. Resenje sa REgeEx je tipa - 'upotrebi funkciju i ne brini, neko je to vec smislio', validno resenja, alimi zelimo da vidimo malo i razmisljanje.

[ Igor Gajic @ 26.06.2013. 20:31 ] @
SQL Server omogucava preko SQLCLR da se koristi .NET...

Regex:
http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

MySQL vec ima ugradjen REGEXP

http://dev.mysql.com/doc/refma...en/regexp.html#operator_regexp
[ Zoran.Eremija @ 30.06.2013. 13:13 ] @
Da se i ja pridruzim sa primerom u Access-u. http://zoraneremija.wix.com/eremijacv#!downloads/c1qda
[ Zidar @ 02.07.2013. 15:34 ] @
Zahvaljujem Zoranu, majstor je majstor Eto sad imamo REGEX I u Accesu. Funkcija koju je Zoran dao, moze se koristiti u BeforeUpdate za kontrolu ili formu u koju s eunosi email adresa.
Code:

'---------------------------------------------------------------------------------------
' Procedure : ValidateEmailAddress
' Author    : Zoran Eremija
' Date      : 30.06.2013
' Source    : http://www.access-programmers.co.uk/forums/showthread.php?t=84248
' Example   :
'---------------------------------------------------------------------------------------
'
Public Function ValidateEmailAddress(ByVal Email As String) As Boolean
    
    Dim mre As Object
    If (mre Is Nothing) Then
        Set mre = CreateObject("vbscript.regexp")
    End If
    mre.Pattern = "^(([a-zA-Z0-9]+_+)|([a-zA-Z0-9]+\-+)|" & _
                "([a-zA-Z0-9]+\.+)|([a-zA-Z0-9]+\++))*" & _
                "[a-zA-Z0-9]+@((\w+\+)|(\w+\.))*\w{1,63}" & _
                "\.[a-zA-Z0-9]{2,6}$"
    ValidateEmailAddress = mre.test(Email)
    
    If InStr(Email, "..") > 0 Then
        ValidateEmailAddress = False
    End If
    
End Function


Ja ne umem da pisem REGEX (mozda nam Zoran na Access forumu pokaze kakao se to radi?) pa sam morao da napisem CHECK constraint u Accesu (Validation Rule na nivou tabele):
Code:

Left([Email],1) Not In ("@",".") 
And Len([Email])>=6 
And Right([Email],1) Not In ("@",".") 
And Len(RTrim(LTrim([email])))=Len([email]) 
And InStr([email],".")>0 
And InStr([email],".@")=0 
And InStr([email],"@.")=0 
And InStrRev([email],".")>InStrRev([email],"@") 
And Len([email])-InStrRev([email],".")>=2 
And Len([email])=Len(Replace([email]," ",""))
[ pajaja @ 02.07.2013. 16:14 ] @
Sta se desava kada sasvim validan mejl bude odbijen od strane takvih sistema? :)
djoka_l je za sad dao najbolji primer regex-a za validaciju mada ni on nije potpun, ne prihvata TLD ili lokalni hostname kao validan (mejl@net, mejl@localhost) kao ni spejs unutar navodnika ("moj mejl"@mejl.com), mozda ima jos nesto ali ovo sam primetio.
[ Zidar @ 04.07.2013. 14:23 ] @
Citat:
(mejl@net, mejl@localhost) kao ni spejs unutar navodnika ("moj mejl"@mejl.com),
Zar su ovo validne email adrese? Ja sam mislio da je svrha constrainta upravo de se ovakvi slucajevi odbiju. Ako treba da prihvatis ovakve slucajeve, onda nema druge neog da uradis jedno od sledecg:
1. sam napsies REGEX
2. napisies CHECK constraint (validation rule u Accessu) koje ce da prihvati ili odbije tacno ono sto tebi treba.
[ pajaja @ 04.07.2013. 18:33 ] @
Validna je, kao i recimo `~!#$%^&*-_=+|{}[email protected], ako se iskoristi i quoted-string lokalni deo moze da sadrzi sve printabilne ASCII karaktere. Wikipedija ima fine primere pa necu smisljati svoje:
Code:

[email protected]
[email protected]
[email protected]
[email protected]
user@[IPv6:2001:db8:1ff::a0b:dbd0]
"much.more unusual"@example.com
"[email protected]"@example.com
"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com
postbox@com
admin@mailserver1
!#$%&'*+-/=?^_`{}|[email protected]
"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
" "@example.org

Domen je lakse validirati mada mi na pamet padaju recimo IDN domeni, kao i IP adrese. Sve ovo treba uzeti u obzir pri validaciji email adrese. Koga zanima detaljnije moze da pogleda RFC5322 koji je zamenio RFC2822.

Citat:
Ako treba da prihvatis ovakve slucajeve, onda nema druge neog da uradis jedno od sledecg:
1. sam napsies REGEX
2. napisies CHECK constraint (validation rule u Accessu) koje ce da prihvati ili odbije tacno ono sto tebi treba.

Postoji i treci i najbolji nacin pored ta dva navedena: ne uradis nista od toga i jednostavno posaljes mejl korisniku, ali to nije tema tako da podrzavam svakoga ko misli da moze da napise dobru proveru da je podeli sa nama :)
[ Zidar @ 05.07.2013. 16:38 ] @
Zahvaljujem. Au, pa izgleda da bas skoro sve prolazi. Nesto smo ipak naucili iz cele price, REGEX ili ne REGEX

Izgleda da postoje dva oblika:
<neki text>@[IP adresa]

<neki text>@example.<neki text>.com

Znaci, ako minimum, treba nam @ I neki text ispred toga (bukvalno bilo sta?)
Posle @ dodje ili IP adresa u zagradama []
ili imamao @.nesto. neki text.com - bar jena tacka iza @ i dva ili tri karaktera iz atacke .rs, .org mozad i .a samo?

Vazi li i dalje da ne smeju da budu zajedno dva znaka @, kao @@ ?

Testirao sam moje ogranicenje u Accesu, sa ovim cudno izgledajucim primerima:
Code:

Left([Email],1) Not In ("@",".") 
And Len([Email])>=6 
And Right([Email],1) Not In ("@",".") 
And (Len(RTrim(LTrim([email])))=Len([email])) 
And InStr([email],".")>0 
And InStr([email],".@")=0 
And InStr([email],"@.")=0 
And InStrRev([email],".")>InStrRev([email],"@") 
And (Len([email])-InStrRev([email],"."))>=2 
And (Len([email])-InStrRev([email],"."))<=3

ZNacenje ogranicenja:
Left([Email],1) Not In ("@",".")                 -- no > or @ at the beginning
And Len([Email])>=6                             -- at least 6 characters
And Right([Email],1) Not In ("@",".")             -- does not end with @ or .
And (Len(RTrim(LTrim([email])))=Len([email]))      -- no space characters AT THE BEGINNING OR AT THE END
And InStr([email],".")>0                         -- there must be at least one .
And InStr([email],".@")=0                         -- no . and @ next to each other, AS IN .@
And InStr([email],"@.")=0                         -- no > and @ next to each other, AS IN .@
And InStrRev([email],".")>InStrRev([email],"@") -- at least one . must be after @
And (Len([email])-InStrRev([email],"."))>=2     -- at least 2 chars after last .
And (Len([email])=Len(Replace([email]," ",""))) -- no spaces in the middle -- ovo je uklonjeno da bi prosao "much.more unusual"@example.com 
And (Len([email])-InStrRev([email],"."))<=3        -- no more than 3 chars after last .



Evo sta je sve proslo:
Email
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
"""much.more unusual""@example.com"
!#$%&'*+-/=?^_`{}|[email protected]
"""()<>[]:,;@\\\""!#$%&'*+-/=?^_`{}| ~.a""@example.org"
""" ""@example.org"

Sta nije proslo:
"[email protected]"@example.com -- no go, ima dva znaka @
user@[IPv6:2001:db8:1ff::a0b:dbd0] -- no go, nema znak . posle @
admin@mailserver1 -- no go, nema . polse @

Ko hoce, moze da proba da napise REGEX ili ogranicenje koje prihvata ovo sto moj uslov odbacuje.






[Ovu poruku je menjao Zidar dana 05.07.2013. u 18:05 GMT+1]