[PHP] Regular expression probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Ik maak voor een contact form om het 'from' veld te validaten, gebruik van een regular expression.
Echter werkt mijn regular expression niet goed zoals verwacht word met PHP, terwijl hij het in een programma zoals 'The Regex Coach' het wel goed doet...

Heb nu de check op het veld zo gemaakt, dat die reguliere expressie overbodig is, dus je zou zeggen dat dat ook goed is, echter doe ik het liever met de reguliere expressie, omdat ik denk dat dat een veel betere performance geeft...

Voor de validatie middels regex gebruik ik de volgende PHP code:
PHP:
1
2
3
4
5
function checkEmail($email)
{
    $email = strtolower($email);
    return preg_match("^[a-zA-Z0-9_-]+([\.]{1}[a-zA-Z0-9_-]+)*@[a-zA-Z0-9_-]+([\.]{1}[a-zA-Z0-9_-])*([\.]{1})+[a-zA-Z]{2,4}$^", $email);
}
Probleem met deze regular expression is dat PHP alles ná het @ hoe dan ook goedkeurt, terwijl 'The Regex Coach' dit niet doet... Nu is dus mijn vraag, waar dit aan zou kunnen liggen...

Moet er wel in de kantlijn bij zeggen, dat ik nog niet zo heel erg super geweldig ben in PHP met regex'jes, vandaar ook deze n00b vraag, maar ben gewoon ten einde raad... Je zou immers zeggen dat hij het overal goed moet doen... ;)

[ Voor 4% gewijzigd door CH4OS op 20-03-2006 15:08 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je vergeet je delimiters. Je hebt nu achteraan wel een ^ toegevoegd (omdat je ws anders een foutmelding kreeg), maar daardoor werken deze ^ nu als delimiters.

Overigens:
[a-zA-Z0-9_-] is hetzelfde als [\w-]
[\.]{1} is hetzelfde als \. (sowieso hoef je de punt in een characterclass niet te escapen, maar een characterclass gebruiken voor 1 enkel teken is ook niet nuttig, hetzelfde geldt voor {1})

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je mist de delimiters en hebt een ^ teveel achteraan. En als je de i-modifier gebruikt, dan heb je je strtolower-call ook niet meer nodig. ;)

Trouwens, je regexp kan niet overweg met mailadressen op een .museum-TLD, en daarnaast is een regexp om goed te controleren op geldige mailadressen een A4-tje lang. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
crisp schreef op maandag 20 maart 2006 @ 15:13:
Je vergeet je delimiters. Je hebt nu achteraan wel een ^ toegevoegd (omdat je ws anders een foutmelding kreeg), maar daardoor werken deze ^ nu als delimiters.
Ja, ik heb daar idd een ^ achteraan gezet, om de foutmelding te voorkomen... Tevens zie ik ^ ook niet heel erg vaak in een email adres van iemand voorkomen, vandaar dat ik die heb gebruikt als delimiter... :)
Overigens:
[a-zA-Z0-9_-] is hetzelfde als [\w-]
[\.]{1} is hetzelfde als \. (sowieso hoef je de punt in een characterclass niet te escapen, maar een characterclass gebruiken voor 1 enkel teken is ook niet nuttig, hetzelfde geldt voor {1})
Kan je deze misschien nog iets meer uitleggen, ik snap deze namelijk niet helemaal... :) Het gaat dan over hetgeen je tussen haakjes hebt staan... :)

Heb de regular expression aangepast naar hetgeen je net vertelde, als het goed is moet ie dan zo:
PHP:
1
2
3
4
5
function checkEmail($email)
{
    $email = strtolower($email);
    return preg_match("^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-])*(\.)+[a-zA-Z]{2,4}$^", $email);
}

[ Voor 18% gewijzigd door CH4OS op 20-03-2006 15:18 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Eerst even een werkend voorbeeld:
PHP:
1
return preg_match("/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-])*\.[a-zA-Z]{2,4}$/", $email);


note hier de delimiters (/) waardoor de eerste ^ nu ook weer doet wat 'ie moet doen (matchen vanaf het begin van je string).

Over wat ik tussen haakjes heb staan:

[.] is een geldige characterclass; de punt heeft hierbinnen geen speciale betekenis en hoeft dus niet escaped te worden.
[.]{1} - de {1} is hier nutteloos omdat enkel [.] ook al op 1 teken matched
een characterclass met maar 1 teken is natuurlijk ook nutteloos omdat je dan het teken ook zonder characterclass in je regexp kan zetten. Echter, omdat het hier om een letterlijke punt gaat moet je 'm buiten je characterclass wel weer escapen --> \.

[ Voor 49% gewijzigd door crisp op 20-03-2006 15:20 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

GJ-tje schreef op maandag 20 maart 2006 @ 15:16:
[...]
Ja, ik heb daar idd een ^ achteraan gezet, om de foutmelding te voorkomen... Tevens zie ik ^ ook niet heel erg vaak in een email adres van iemand voorkomen, vandaar dat ik die heb gebruikt als delimiter... :)
^ staat voor het begin van een string, en $ voor het einde. Kijk anders ook even in onze FAQ waar een mooie uitleg staat over regexps, inclusief links. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
crisp schreef op maandag 20 maart 2006 @ 15:18:
Eerst even een werkend voorbeeld:
PHP:
1
return preg_match("/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-])*\.[a-zA-Z]{2,4}$/", $email);


note hier de delimiters (/) waardoor de eerste ^ nu ook weer doet wat 'ie moet doen (matchen vanaf het begin van je string).
Ja, dat is me nu duidelijk, maar waarom gebruik je dan liever / ipv ^? Ik bedoel, zie jij veel email adressen voorbij komen, die een ^ er in hebben? Ik namelijk niet, dus maakt het toch niet uit welk teken je gebruikt voor de delimiter? ;)
-NMe- schreef op maandag 20 maart 2006 @ 15:19:
^ staat voor het begin van een string, en $ voor het einde. Kijk anders ook even in onze FAQ waar een mooie uitleg staat over regexps, inclusief links. :)
Ah oke, weer wat geleerd... Over de FAQ, daar had ik al in gekeken, maar vind die om eerlijk te zijn wat onduidelijk... O+ En tevens word mijn probleem er ook niet in uitgelegt, want ik snap niet waarom The Regexp Coach de reguliere expressie wel slikt en PHP niet... :)

[ Voor 33% gewijzigd door CH4OS op 20-03-2006 15:24 ]


Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 12-09 11:42

EnnaN

Toys in the attic

staat dit zo wel het perfectly legal
code:
1
email+forum_activatie@gmail.com toe?


edit: (even code eromheen)

[ Voor 23% gewijzigd door EnnaN op 20-03-2006 15:21 ]

sig


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

GJ-tje schreef op maandag 20 maart 2006 @ 15:20:
[...]
Ja, dat is me nu duidelijk, maar waarom gebruik je dan liever / ipv ^? Ik bedoel, zie jij veel email adressen voorbij komen, die een ^ er in hebben? Ik namelijk niet, dus maakt het toch niet uit welk teken je gebruikt voor de delimiter? ;)
Nee, maar het is ueberhaupt niet verstandig om een teken met een speciale betekenis binnen een reguliere expressie als delimiter te gebruiken, zeker niet als je dat teken binnen je expressie nog nodig hebt ;)
EnnaN schreef op maandag 20 maart 2006 @ 15:21:
staat dit zo wel het perfectly legal
code:
1
email+forum_activatie@gmail.com toe?


edit: (even code eromheen)
Nee, zo te zien niet :P

[ Voor 19% gewijzigd door crisp op 20-03-2006 15:27 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Superdeboer
  • Registratie: December 2002
  • Niet online

Superdeboer

Sa-weee-tah

Lees in verband met het valideren van mailadressen ook even [rml][ ALG] Juist email adres *[/rml] helemaal. Daar zijn verschillende mogelijkheden genoemd, er staan wat kickass regexen en andersoortige checks. :)

When I write my code, only God and I know what it means. One week later, only God knows.
Hell yes it's a Cuban Cigar, but I'm not supporting their economy, I'm burning their fields.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Superdeboer schreef op maandag 20 maart 2006 @ 15:30:
Lees in verband met het valideren van mailadressen ook even [rml][ ALG] Juist email adres *[/rml] helemaal. Daar zijn verschillende mogelijkheden genoemd, er staan wat kickass regexen en andersoortige checks. :)
I'm on my way... ;)

Maar heb je ook een verklaring, waarom de regexp niet (goed) werkt in PHP, terwijl The Regexp Coach' het wel goed doet? :?

Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Email validatie is niet te doen... Voor de @ mogen meerdere punten staan en na de @ kan alles staan en er hoeft niet eens een punt in te zitten. Je kun zelfs prof.dr.dhr.jurgle.msc@123.123.123.123 hebben. of a@a in het geval je een pc in je lan hebt die a heet.

Edit:
Als je een echte check wilt, dan test je of je kan connecten en vervolgens stuur je een mail met een link, die bevestigd moet worden.

[ Voor 22% gewijzigd door Jurgle op 20-03-2006 15:40 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

GJ-tje schreef op maandag 20 maart 2006 @ 15:31:
[...]

I'm on my way... ;)

Maar heb je ook een verklaring, waarom de regexp niet (goed) werkt in PHP, terwijl The Regexp Coach' het wel goed doet? :?
Volgens mij omdat je in de Regexp Coach geen delimiters hoeft te gebruiken :)

[ Voor 64% gewijzigd door crisp op 20-03-2006 15:38 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Superdeboer
  • Registratie: December 2002
  • Niet online

Superdeboer

Sa-weee-tah

Jurgle:
Email validatie is niet te doen... Voor de @ mogen meerdere punten staan en na de @ kan alles staan en er hoeft niet eens een punt in te zitten. Je kun zelfs prof.dr.dhr.jurgle.msc@123.123.123.123 hebben. of a@a in het geval je een pc in je lan hebt die a heet.

Edit:
Als je een echte check wilt, dan test je of je kan connecten en vervolgens stuur je een mail met een link, die bevestigd moet worden.
Dat is theoretisch juist en dat had ik ook even in de pen toen ik mijn vorige reactie plaatste... echter, praktisch gezien is dat nogal overdone natuurlijk. Voor een contactform wil je gewoon even checken of er geen 'blaat' als mailadres wordt ingevoerd - mail met bevestigingslink is natuurlijk nogal overdreven voor een contactform. ;)

When I write my code, only God and I know what it means. One week later, only God knows.
Hell yes it's a Cuban Cigar, but I'm not supporting their economy, I'm burning their fields.


Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Superdeboer schreef op maandag 20 maart 2006 @ 15:58:
[...]

Dat is theoretisch juist en dat had ik ook even in de pen toen ik mijn vorige reactie plaatste... echter, praktisch gezien is dat nogal overdone natuurlijk. Voor een contactform wil je gewoon even checken of er geen 'blaat' als mailadres wordt ingevoerd - mail met bevestigingslink is natuurlijk nogal overdreven voor een contactform. ;)
check dan alleen op .*?@.*? dat moet dan genoeg verzekerd zijn

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Nou voor de contact form die ik ga maken, weet ik zeker dat er vrijwel nooit dingen als @localhost en dergelijke zullen gaan komen en IP-adressen die ik ook niet zo snel gebeuren... Mocht het wel gebeuren, kan ik er een filter op maken, omdat ik weet dat er nooit iemand een email adres als @localhost in 'mag' vullen, omdat ze die zelf niet zijn... ;) Mocht er iemand een IP-adres vullen, kan ik er eigenlijk ook wel zo goed als zeker er van uit gaan, dat het iemand met een eigen server is en dus ook wel een @isp.tld email adres heeft.,. ;) Wat er voor het apenstaartje komt te staan, maakt me ook geen malle moer uit, zolang ik maar zeker weet dat er een @ in staat en minimaal 1 . na het apenstaartje... :) kan dat ook wel met strpos en dergelijke doen, maar wilde regular expressions proberen; dan leer ik tenminste ook nog wat... :)

[ Voor 12% gewijzigd door CH4OS op 20-03-2006 18:11 ]


Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Zoals: /[^@]+@[^.]+\..+/ of is het al opgelost?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant

Pagina: 1