Patrick Canterino: Semikolon an erster Stelle

Hallo Forum!

Mein Form-Mailer macht so weit Fortschritte. Aber es gibt immer noch ein ziemlich nerviges Problem:

Das Skript enthält eine Adressen-Validierung, die ungültige E-Mail-Adressen herausfiltern soll. Dummerweise scheitert das Skript an einem Semikolon an der ersten Stelle.

Ich habe schon das hier ausprobiert:

if(strpos($email_from,";") != "")
{
 include("include/invalid_emailad.htm");
 exit;
}

Diese Methode kommt mit einem Semikolon an der ersten Stelle nicht zurecht und bezeichnet die Adresse als gültig. Wenn sich das Semikolon an einer anderen Stelle befindet, gibt es keine Probleme.

Dann habe ich noch das hier ausprobiert:

if(strpos($email_from,";") >= 0)
{
 include("include/invalid_emailad.htm");
 exit;
}

Das funktioniert leider zu gut und jede Sorte von E-Mail-Adresse ist für das Skript ungültig.

Weiß zufällig jemand Rat?

Viele Grüße

Patrick Canterino

  1. ahoi!

    if(strpos($email_from,";") >= 0)
    {
    include("include/invalid_emailad.htm");
    exit;
    }

    Das funktioniert leider zu gut und jede Sorte von E-Mail-Adresse ist für das Skript ungültig.

    nun, das ergebnis is doch da immer true, weil das semikolon in jedem string mind. 0mal vorkommt...
    aender doch mal das >= zu einem einfach >

    ich hab Dich doch richtig verstanden, dass alle email-adressen mit mind. 1 semikolon als falsch gelten sollen, oder?

    cu
    seth

    1. ahoi!

      if(strpos($email_from,";") >= 0)
      {
      include("include/invalid_emailad.htm");
      exit;
      }

      Das funktioniert leider zu gut und jede Sorte von E-Mail-Adresse ist für das Skript ungültig.

      nun, das ergebnis is doch da immer true, weil das semikolon in jedem string mind. 0mal vorkommt...

      Nun, eingentlich nicht ganz richtig: die funktion liefert false zurueck, wenn der Suchstring nicht gefunden wurde, aber false ist ja der int-wert 0 ...

      MFG

      Phil*derkleinedummeklugscheissermitdenabstehendenohren*ipp

      1. ahoi Philipp!

        Nun, eingentlich nicht ganz richtig: die funktion liefert false zurueck, wenn der Suchstring nicht gefunden wurde, aber false ist ja der int-wert 0 ...

        jetz versteh ich nich so ganz, was ich mit dieser aussage anfangen soll... selbstverstaendlich ist 'zeichen nicht gefunden' das gleiche wie 'zeichen 0mal vorhanden' ;-)

        besteht Dein problem immer noch oder _war_ das gleichzeichen zuviel?

        cu
        seth

      2. Moin,

        nun, das ergebnis is doch da immer true, weil das semikolon in jedem string mind. 0mal vorkommt...

        Nein, strpos() gibt die Position an der sich der gegebene String befindet zurück, bzw. false wenn er nicht vorkommt. Mit irgendeiner Anzahl hat die Funktion nichts zu tun.

        Nun, eingentlich nicht ganz richtig: die funktion liefert false zurueck, wenn der Suchstring nicht gefunden wurde, aber false ist ja der int-wert 0 ...

        'Note:  It is easy to mistake the return values for "character found at position 0" and "character not found". Here's how to detect the difference: ', das stammt nicht etwa aus irgendeiner schwer zu findenden FAQ über irgendein weltfremdes Thema sondern aus der offiziellen Dokumentation zu strpos() unter http://www.php.net/strpos.

        --
        Henryk Plötz
        Grüße von der Ostsee

    2. Hallo!

      Ich habe mittlerweile herausgefunden, wie es auch geht - und diesmal funktioniert es!
      Und zwar mit dieser Abfrage:

      if(stristr($email_from,";") != "")
      {
       include("include/invalid_emailad.htm");
       exit;
      }

      Viele Grüße

      Patrick Canterino

  2. Hallo Forum!

    Tag auch

    Das Skript enthält eine Adressen-Validierung, die ungültige E-Mail-Adressen herausfiltern soll. Dummerweise scheitert das Skript an einem Semikolon an der ersten Stelle.

    Ich habe schon das hier ausprobiert:

    if(strpos($email_from,";") != "")
    {
    include("include/invalid_emailad.htm");
    exit;
    }

    ?! Wenn die ermittelte Position von ';' ungleich einem leeren String ist? Was soll das bringen?

    Diese Methode kommt mit einem Semikolon an der ersten Stelle nicht zurecht und bezeichnet die Adresse als gültig. Wenn sich das Semikolon an einer anderen Stelle befindet, gibt es keine Probleme.

    Dann habe ich noch das hier ausprobiert:

    if(strpos($email_from,";") >= 0)
    {
    include("include/invalid_emailad.htm");
    exit;
    }

    Auch nicht schlecht, wurde aber schon was drüber erzählt...

    Ich hätte da was, was gleich die ganze Syntax auf einmal checkt... (zumindest hoffe ich das)

    if (!preg_match("/^([a-zA-Z0-9]{1,}([.]?|[-]?|[_]?))*[a-zA-Z0-9]{1,}@([a-zA-Z0-9]{1,}([.]?|[-]?))*[a-zA-Z0-9]{1,}.{1}[a-zA-Z]{2,6}$/",$HTTP_POST_VARS["email"]))
         {
          die("Die von Ihnen angegebene Mailadresse ist ungültig!\n</body></html>");
         }

    Also:

    das erste Zeichen der Mailadresse darf 0-9,a-z,A-Z sein und dies kann sich dann beliebig oft wiederholen. '.','-' und '_' dürfen darauf folgen, müssen aber nicht (somit dürfen dies auch nicht als erstes Zeichen der Adresse da stehen) dieses muster darf sich bis hier beliebig oft wiederholen >> '^([a-zA-Z0-9]{1,}([.]?|[-]?|[_]?))*' (wobei dann auch ausgeschlossen wird das '.' auf '-' folgt, '-' auf '.', '_' auf '-'; also alle hier möglichen Kombinationen.)

    Es muß aber zumindest einmal ein Zeichen aus 0-9,a-z und A-Z vor dem @ vorgekommen sein, wobei hier auch ausgeschlossen wird, das '.','-' und '_' direkt vor dem '@' stehen - '@' muß dann auch einmal vorkommen, aber nicht öfter. Das wäre dann dieser Teil: [a-zA-Z0-9]{1,}@

    Dann wird geprüft, ob das, was auf '@' folgt ein Zeichen aus 0-9,a-z und A-Z ist und das darauf ein '.' oder '-' folgen kann ('_' im Domainnamen ist AFAIK nicht erlaubt) Auch dieses Schema darf sich beliebig oft wiederholen (darf aber auch garnicht vorkommen), wobei dann auch kein '.' oder '-' dierekt hinter dem '@' stehen darf und diese zwei Zeichen auch nicht direkt hintereinander stehen dürfen. (Dieser Teil hier: ([a-zA-Z0-9]{1,}([.]?|[-]?))*)

    Es muß jedoch mindestens einmal (ich bin mir nicht sicher ob man 1 stellige Domainnamen haben darf) ein Zeichen aus 0-9,a-z und A-Z vorkommen bevor ein '.' kommt. ([a-zA-Z0-9]{1,}.{1})

    Nach diesem punkt müssen dann mindestens zwei; maximal 6 Zeichen (TLD '.museum') aus a-z und A-Z vorkommen (Zahlen in der TLD sind nicht erlaubt) wobei das ganze dann auch hier zuende sein muß ([a-zA-Z]{2,6}$)

    Wenn ich also beim ertsellen dieses Ausdrucks alles richtig bedacht habe, dann sollte der die Mailadresse korrekt auf Ihre Gültigkeit prüfen. Umlaute sind kein Teil von a-z und A-Z - zumindest im US Alphabet, was bei PHP gilt... (wenn das nichts ist, was man umstellen kann - man weis ja nie.)

    Sollte da ein Fehler drinn sein, dann bitte hier posten...

    bye
    ich

    1. Hallo du!

      Es hat leider nicht funktioniert. Für diese Abfrage sind alle E-Mail-Adressen ungültig.

      Viele Grüße

      Patrick Canterino

      1. Hallo du!

        Tag Du!

        Es hat leider nicht funktioniert. Für diese Abfrage sind alle E-Mail-Adressen ungültig.

        Dir ist schon klar, das Du '$HTTP_POST_VARS["email"]' (steht recht weit am ende) durch die Variable ersetzen mußt, die die Mailadresse enthält, die Du überprüfen möchtest? Woher soll die funktion denn sonst wissen, was der zu überprüfende String ist?

        Ich hab jetzt bei der Geschichte mal die Kenntniss der Syntax von preg_match() vorausgesetzt...

        Bei Bedarf steht mehr dazu in der Dokumentation von PHP, die man sich ja bei http://www.php.net/ runterladen (oder dort ansehen) kann.

        bye
        ich

        1. Hallo du!

          Dir ist schon klar, das Du '$HTTP_POST_VARS["email"]' (steht recht weit am ende) durch die Variable ersetzen mußt, die die Mailadresse enthält, die Du überprüfen möchtest? Woher soll die funktion denn sonst wissen, was der zu überprüfende String ist?

          Oh sch...! Das habe ich vollkommen übersehen! *ärger* Ich war mal wieder nicht ganz bei der Sache. Tut mir leid.
          Klar, jetzt funktioniert's. Danke!

          Viele Grüße

          Patrick Canterino