[HILFE] Variable nach e-Mail spezifischen Zeichen durchsuchen

Martin_N

wissensdurstig
Huhu =)

Ich lerne zurzeit Webdesign, speziell Programmieren mit PhP und PhPMyAdmin, MySQL.

Mein derzeitiges Lernprojekt ist ein Browsergame(Thematik: irgend etwas kaufen, verkaufen und verwalten, sehr simpel gehalten, aber egal jetzt..) . Seit einigen Stunden bin ich daran das Registrierungsformular best möglich zu sichern und Fehler seiten des Benutzers rechtzeitig zu erkennen um den Benutzer XY auf diese(n) aufmerksam zu machen.

Nun zu meinem genauen Problem.. Ich möchte überprüfen ob die eingetragenen und übertragene Variable "newemail" einer echten e-Mail ähnelt.
xy = a-zA-Z0-9​
xy@xy.xy​
Das ganze realisiere mit dem Befehl preg_match("such nach", $in_variable)
Das übertragen der Variable funktioniert fehlerfrei. Fehler die vor dem @ Zeichen gemacht werden, sprich wenn keine Zahl oder Buchstabe geschrieben wurde:
@as.de2​
werden erkannt und die entsprechende Fehlermeldung wird ausgegeben.

Wenn ich eine Zahl oder einen Buchstaben nach dem @ schreibe:
test@a.de2​
funktioniert alles brav und wunderbar.

So bald nach dem @ jedoch 2 oder mehr Zeichen stehen, wird mir die e-Mail als falsch erkannt.
test@as.de2​


Teil des Formulares. (<form ~~> </form> fehlt.)
HTML:
			<table>
<tr>
				<td class="td_describ">e-Mail:</td>
				<td><input class="account_input" type="text" value="<?php echo $_POST['newemail'];?>" name="newemail" /></td>
			</tr>
</table>

PhP Teil
PHP:
			// e-Mail:
			if (isset($_POST['newemail']) && preg_match("/[a-zA-Z0-9]@[a-zA-Z0-9]\.[a-zA-Z0-9]/", $_POST['newemail']) == true) {
				echo '<br />Die e-Mail scheint korrekt zu sein';
				$newemail = $_POST['newemail'];
				$newemailOK = 1;
			} else {
				echo '<br />Die e-Mail entspricht <span class="bold">nicht</b> den Anforderungen.';
				$newemailOK = 0;
			}


Ich habe bereits nach dem Fehler gegoogled und nichts gefunden, des weiteren habe ich ein wenig mit den Zeichen rumgespielt, die für das durchsuchen der variable genutzt werden. Was mir bis lang auch viel geholfen hat. An diesem Punkt hänge ich aber fest..

Des weiteren habe ich "check_email("test@test.de")" gefunden. Wenn ich diesen Befehl anwende gibt er mir folgende Fehlermeldung aus:
Fatal error: Call to undefined function check_mail() in C:\xampp\htdocs\tesconic\content\konto.php on line 161
PHP:
			if (check_mail("test@test.de")) {
				echo '<br />Die e-Mail scheint korrekt zu sein';
				$newemail = $_POST['newemail'];
				$newemailOK = 1;
				echo "<br /><br />".$_POST['newemail'];
			} else {
				echo '<br />Die e-Mail entspricht <span class="bold">nicht</b> den Anforderungen.';
				$newemailOK = 0;
				echo "<br /><br />".$_POST['newemail'];
			}
 
Du brauchst Quantifikatoren für Deinen Regulären Ausdruck!
Code:
/[a-zA-Z0-9]@[a-zA-Z0-9]\.[a-zA-Z0-9]/

Deine Zeichenkette [a-zA-Z0-9] definiert genau ein Zeichen. Außerdem brauchst Du ebenfalls das Überprüfen von "." und "_". Kleiner Tip: Es gibt bereits existierende Lösungen um Mailadressen syntaktisch zu verifizieren.
 
Warum muss man es sich denn immer so schwer machen? Das ist doch viel einfacher:
PHP:
filter_var('bob@example.com', FILTER_VALIDATE_EMAIL);
 
Vielen dank für eure Beiträge =)

Zurzeit teste ich die Idee von "einfach nur crack". Dazu habe ich eine Verständnissfrage:
Mit deinem code wird überprüft ob es sich um eine realistische e-Mail handelt oder nicht?
Denn wenn ich​
verwende, funktioniert es nicht. Wenn ich die 2 entferne, funktioniert es. Gleiches gilt, wenn ich als TLD z.B.:
"rofllol"​
verwende.

Folgende e-Mail wird als valid angegeben:
"dsfd.s@sd"​
Meine Quellcode:
PHP:
			if (isset($_POST['newemail']) && filter_var($_POST['newemail'], FILTER_VALIDATE_EMAIL) != false) {
				echo '<br />Die e-Mail scheint korrekt zu sein';
				$newemail = $_POST['newemail'];
				$newemailOK = 1;
			} else {
				echo '<br />Die e-Mail entspricht <span class="bold">nicht</b> den Anforderungen.';
				$newemailOK = 0;
			}
 

Anhänge

  • register.png
    register.png
    11,8 KB · Aufrufe: 6
Joa, dann bestätigt sich mein Verdacht.

Und wie ist das mit der e-Mail "dsfd.s@sd" die als valid angegeben wird?
Ich habe die Seite mehrmals neugeladen und mittels F5 den Cache gelöscht um 100% die aktuelle überprüfung zu benutzen.

Hat jemand von euch eine Idee?
 
Weil das eine valide Email-Adresse ist. Zumindest rein äußerlich ist sie das. Schon mal sowas gelesen:

root@localhost

Wenn du prüfen willst, ob die Domain in der Email-Adresse auch wirklich existiert (erreichbar ist), wirst du nicht drum herum kommen, den MX-Eintrag prüfen müssen:

PHP:
function validate_email($email)
{
  //by Femi Hasani
  if(!preg_match ("/^[\w\.-]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]+$/", $email))
    return false;

  list($prefix, $domain) = split("@",$email);

  if(function_exists("getmxrr") && getmxrr($domain, $mxhosts))
  {
    return true;
  }
  elseif (@fsockopen($domain, 25, $errno, $errstr, 5))
  {
    return true;
  }
  else
  {
    return false;
  }
}

Wenn du noch weiter gehen willst, kannst du auch noch VRFY und EXPN benutzen.
 
Jop, die habe ich schon häufiger gelesen. Ich dachte aber das keine e-Mail ist sondern irgend etwas anderes. Und einen großen Dank =)

PHP:
function validate_email($email)
{
  //by Femi Hasani [www.vision.to]
  if(!preg_match ("/^[\w\.-]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]+$/", $email))
    return false;  /* e-Mail == invalid */
 
  list($prefix, $domain) = split("@",$email);
 
  if(function_exists("getmxrr") && getmxrr($domain, $mxhosts))
  {
    return true; /* e-Mail == valid */
  }
  elseif (@fsockopen($domain, 25, $errno, $errstr, 5))
  {
    return true; /* e-Mail == valid */
  }
  else
  {
    return false;  /* e-Mail == invalid */
  }
}
Ist das so richtig oder sind die Kommentare falsch? Ich habe mit dieser Art von Funktion noch keine Erfahrung gemacht.
function = klasse oder?
 
Eine Klasse ist die Schablone für ein Objekt. Einfaches Beispiel:

PHP:
/**
 * Eine Schablone für ein Auto
 */
class Auto
{
  /**
   * Die Farbe des Autos als Eigenschaft
   */
  private $_farbe;

  /**
   * Diese Konstruktor-Funktion wird beim Erzeugen eines neuen Objektes
   * automatisch aufgerufen
   * @param string $farbe Die Farbe des neuen Autos
   */
  public function __construct($farbe)
  {
    $this->_farbe = $farbe;
  }

  /**
   * Mit dem Auto fahren
   */
  public function fahren()
  {
     // Hier den Code einbauen, der ablaufen soll, wenn das Auto fährt
     echo "Wir fahren jetzt mit dem " . $this->_farbe . " Auto<br/>";
  }

  /**
   * Das Auto anhalten
   */
  public function anhalten()
  {
     // Hier den Code einbauen, der ablaufen soll, wenn das Auto anhält
     echo "Das " . $this->_farbe . " Auto hält jetzt an.<br/>";
  }
}

// Hier wird jetzt ein neues Auto-Objekt erzeugt
$auto = new Auto("schwarz");
// Dann kann man die public Methoden aufrufen
$auto->fahren();
$auto->anhalten();

Wenn du mehr über Klassen und Objekte wissen möchtest, kannst du hier nachfragen (neues Thema) oder im PHP-Handbuch nachsehen.
 
Zurück