E-Mailadressen in einem String erkennen/ersetzen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • E-Mailadressen in einem String erkennen/ersetzen

    Hallo zusammen

    Ich möchte auf einer Seite alle vorkommen von E-Mailadressen finden und durch und vor der Ausgabe im Browser mit folgender Funktion verschlüsseln:
    Code:
    function convema($email)
    {
       for($i=0; $i<strlen($email); $i++)
       {
          if(substr($email,$i,1)!="@" && substr($email,$i,1)!=".")
             $cem .= "&#" . ord(substr($email,$i,1)) . ";";
          else
             $cem .= substr($email,$i,1);
       }
       return "<a href=\"mailto:" . $cem . "\">" . $cem . "</a>";
    }
    Die obige Funktion geht auch, wenn ich eine Mailadresse rein gebe.

    Aber ich schaffe es nicht einen kompletten String auf alle vorkommen einer Mailadresse zu durchsuchen und zu ersetzen.

    Ich bin bei meiner Suche auf die Funktion preg_match_all gestossen. Diese merkt zwar, dass im String Mailadressen vorkommen, aber leider schaffe ich nicht auf diese zuzugreifen.

    Ich stelle mir den Codeablauf in etwa folgendermassen vor:
    1. String auf Mailadis durchsuchen und mir diese merken
    2. In einer Schleife alle gefundenen Mailadis mit der obigen Funktion verschlüsseln
    3. String auf alle gefundenen Mailadis durchsuchen und diese nun mit der verschlüsselten Version ersetzen


    Hat jemand eine Idee, wie ich hier weiterkommen kann?

    Danke & Gruss
    Philipp

  • #2
    Normal würde ich die Mailadressen nicht suchen sondern gleich beim Einsatz "verschlüsseln".

    Kommentar


    • #3
      Schau dir mal das hier und ggf. die nächsten beiden Abschnitte an. Dann siehst du, dass das wunderbar mit preg_match_all geht.

      Peter
      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
      Meine Seite

      Kommentar


      • #4
        Hallo Peter

        Danke für den Tipp. Geht genau in diese Richtung, wo ich gehen will.
        Aber etwas läuft bei mir einfach nicht ganz so, wie's sollte. Ich habe das Beispiel aus Abschnitt 2 1:1 kopiert und bei mir eingefügt:
        Code:
        $result = 'Text mit diversen Links wie 
                    <a href="bla.htm">bla</a> oder
                    <a href="blubb.htm">blubb</a> 
                    und noch etliche weitere';
        preg_match_all ("|<a[^>]*>.+\w</a>|i",$result, $links);
        print_r($links);
        Laut Beschreibung müsste folgende Ausgabe generiert werden:
        Code:
        Array
        (
          [0] => Array
            (
              [0] => <a href="bla.htm">bla</a>
              [1] => <a href="blubb.htm">blubb</a>
            )
        
        )
        Bei mir kommt aber diese:
        Code:
        Array 
        ( 
          [0] => Array 
           ( [0] => bla  
             [1] => blubb  
           ) 
        )
        Preg_match_all macht bei mir einfach nicht dass, was es sollte.
        Die eingesetzte PHP-Version bei mir ist übrigens die 5.2.6.

        Noch eine Idee?

        Danke und Gruss
        Philipp

        Nachtrag:
        Obiger "Fehler" hat sich erledigt. Das Beispiel geht. Aber leider klappt das Auffinden der Mailadressen aus dem String immer noch nicht.
        Ich verwende folgenden Ausdruck: "/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)?(\.[_a-zA-Z0-9-]{2,4})$/"

        Vielleicht passt dieser auch nicht oder jemand hat einen besseren Vorschlag.


        @piratos: Normalerweise würde ich dir recht geben, aber leider pflegt eine gute Fee bei uns die entsprechende Seite. Trotz mehrmaliger Anweisung, wie sie Adressen erfassen soll, schafft die das einfach nicht. Und wenn der DAU nichts dazulernen mag, muss es das Programm halt erledigen.
        Zuletzt geändert von philippCH; 23.07.2009, 09:26.

        Kommentar


        • #5
          So, bin einen Schritt weiter.
          Nun wird der String korrekt durchsucht und $result liefert alle vorhandenen Mailadressen.

          Folgenden Code habe ich beisammen:
          Code:
          preg_match_all('/[A-Z0-9._%-]+@[A-Z0-9-]+.[A-Z]{2,4}/i', $text_left, $result, PREG_PATTERN_ORDER);
          $count=count($result);
          for($y = 0; $y <= $count; $y++) {
          	$emaillink=convema($result[0][$y]);
          	$text_left = str_replace($result[0][$y], $emaillink, $text_left);
          }
          Nun macht aber count() Ärger, der liefert immer 1 zurück, auch wenn in $result 4 Mailadis enthalten sind.
          Wenn ich in der for-Schleife $count mit dem Wert 4 ersetze, gehts wunderbar, aber ist ja nicht wirklich eine Lösung.

          Hatte dieses Problem mit count() noch nie.

          Weiss jemand Rat?

          Kommentar


          • #6
            Lösung gefunden:
            Code:
            $count = preg_match_all('/[A-Z0-9._%-]+@[A-Z0-9-]+.[A-Z]{2,4}/i', $text_left, $result, PREG_PATTERN_ORDER);
            for($y = 0; $y <= $count; $y++) {
            	$emaillink=convema($result[0][$y]);
            	$text_left = str_replace($result[0][$y], $emaillink, $text_left);
            }

            Kommentar


            • #7
              PHP-Code:
              $count=count($result[0]); 

              Kommentar


              • #8
                Zitat von philippCH Beitrag anzeigen
                Code:
                '/[A-Z0-9._%-]+@[A-Z0-9-]+.[A-Z]{2,4}/i
                Ich würde den regulären Ausdruck nochmal überprüfen, insbesondere nach dem @:
                Adressen wie Max.Mustermann@mailbox.uni-sonstwo.de werden nicht unterstützt, da bei dir nur genau 1 second-level domain erlaubt ist.
                Der Punkt muss eigentlich mit \ escaped werden, dein Ausdruck nimmt an der Stelle genau ein beliebiges Zeichen.

                Gruß,

                Anja
                Zuletzt geändert von AmicaNoctis; 23.07.2009, 18:08.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar

                Lädt...
                X