Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sähköpostiosoitteen tarkistus

Jaska [13.11.2010 16:24:29]

#

Elikkä projektissani pitäisi seuraavaksi tarkistaa sähköpostiosoitteen oikeellisuus. Tein sivun Stack Overflow mukaan, mutta PHP-tulkki herjaa

lainaus:

Parse error: syntax error, unexpected '(' in Warning: ereg() [function.ereg]: REG_BADRPT in .../helpfun.php on line 30

Koodini on tällä hetkellä seuraavanlainen:

function validate_email($email) {
  $test="(?:[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])+)\])";
 if (ereg($test, $email) == true) {
   return true;
 }
 else {
   return false;
 }
}

Metabolix [13.11.2010 16:53:35]

#

En tosiaan tiedä, mitä teet, mutta jotenkin onnistut ilmeisesti ajamaan ereg-funktion käytöstä aiheutuvan varoituksenkin PHP-tulkin läpi, jolloin seuraa syntaksivirhe. Mitä tuossa virheilmoituksessa mainitulla rivillä on?

Funktio ereg on vanhentunut, sitä ei pidä käyttää enää. Lisäksi tuollainen mutkikas lauseke sähköpostiosoitteen tarkistukseen on aivan tarpeeton; yksinkertainen lauseke ".+@.+\\..+" estää jo suuren osan tyypillisistä virheellisistä osoitteista ("en kerro", "ei ole" yms.).

Jos käytössä on tarpeeksi uusi PHP:n versio, voit käyttää filter_var-funktiota:

function validate_email($email) {
  return filter_var($email, FILTER_VALIDATE_EMAIL);
}

Jaska [13.11.2010 16:58:42]

#

Tuo virheen aiheuttava rivi on

if (ereg($test, $email) == true) {

Näköjään tuo filter_varkin toimii. Kiva oppia taas uutta! Mikä sitten on moderni tapa tarkistaa säännöllisiä lausekkeita PHP:ssä?

eq [13.11.2010 19:10:16]

#

Jaska kirjoitti:

if (ereg($test, $email) == true) {

Parannusehdotus:

if ((ereg($test, $email) == true) == true) {

Macro [13.11.2010 19:13:22]

#

Jaska kirjoitti:

Mikä sitten on moderni tapa tarkistaa säännöllisiä lausekkeita PHP:ssä?

En sitten modernista tiedä, mutta itse käytän preg_match-funktiota.

Metabolix [13.11.2010 19:26:53]

#

eq:n pureva sarkasmi voi olla aloittelijalle vaikea käsittää, joten tässä on hieman lisätietoa aiheesta.

Kaikki seuraavat ehdot tuottavat saman tuloksen:

if (ereg($test, $email)) {...}
if (ereg($test, $email) == true) {...}
if ((ereg($test, $email) == true) == true) {...}
if (((ereg($test, $email) == true) == true) == true) {...}

If-lauseen ehtona on aina totuusarvo eli true tai false. Esimerkiksi vertailu 3 < 5 tuottaa tulokseksi arvon true. Vastaavasti nollasta poikkeavat lukuarvot muuttuvat tarkistuksessa arvoksi true. Yllä ereg-funktion paluuarvo sopii suoraan ehtoon (1. rivi). Vertailu arvoon true on turha (2. rivi). Kyseinen vertailu kuitenkin palauttaa taas arvon true tai false, jota voidaan uudestaan verrata arvoon true (3. rivi). Samaa ketjua voi jatkaa mielin määrin pidemmällekin.

Yleensä vertailu arvoon true tai false jätetään kirjoittamatta, koska se ei selkeytä tilannetta (paitsi ehkä aloittelijalle, joka ei vielä ymmärrä asiaa).

if ($x == true)  {} /* <=> */ if ($x)  {}
if ($x == false) {} /* <=> */ if (!$x) {}
if ($x != true)  {} /* <=> */ if (!$x) {}
if ($x != false) {} /* <=> */ if ($x)  {}

Joskus kuitenkin täytyy erottaa todellinen false esimerkiksi luvusta 0, jolloin tarvitaan täsmällistä vertailua (=== tai !==). Yksi tällainen tilanne on merkin etsiminen merkkijonosta:

// Tavallinen vertailu (==) ei erota nollaa ja falsea:
if (strpos("teksti", "t") == false) {
  echo "Ei löytynyt!\n";
} else {
  echo "Löytyi kohdasta ", strpos("teksti", "t"), "\n";
}
// Virheellinen tulos: Ei löytynyt!

// Täsmällinen vertailu (===) on nimensä mukaisesti täsmällinen:
if (strpos("teksti", "t") === false) {
  echo "Ei löytynyt!\n";
} else {
  echo "Löytyi kohdasta ", strpos("teksti", "t"), ".\n";
}
// Oikea tulos: Löytyi kohdasta 0.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta