nick-name: In String nur die Mail-Adresse modifizieren (Punkte ersetzen)

Hallo Zusammen,

ich hänge nun schon einige Tage an der Suche nach einer Lösung für ein scheinbar kleines Problem. Komme aber nicht drauf und hoffe nun, dass mir hier jemand auf die Sprünge helfen kann.

Folgendes: Ich lese Texte in eine Datenbank ein. Dabei werden die Texte in ihre Sätze per expolde zerpflückt. Als Delimiter wird der "Punkt" verwendet, darum möchte ich die Punkte in Mail-Adressen oder URLs vorher zb. durch "." ersetzen.

Hier ein Beispiel.:
Ursprungsstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."
Zielstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."

Als Rregexe zur Erkennung der Mail verwende ich ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$. klappt gut aber dann versagt meine Logig beim Ersetzen der Punkte ausschließlich in der Mail.

Ich wäre für jeden Hinweis sehr dankbar.

Viele Grüße,
Frank

  1. Moin!

    Hier ein Beispiel.:
    Ursprungsstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."
    Zielstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."

    Es ist zunächst mal fraglich, ob deine Ersetzung überhaupt was bringt. Klar, manche Adress-Spider sind noch so blöd und scheitern bei der Erkennung an Entities und numerischen Zeichenreferenzen, aber wenn ich so einen Spider bauen würde, würde ich irgendeine Standard-HTML-Bibliothek benutzen, die mir den Quelltext nett parst, und die würde diese Entities automatisch in das Ursprungszeichen zurückwandeln.

    Rechenzeit dafür hätte ich garantiert genug, weil meine Bot-Herde ausreichend groß ist.

    Aber wenn tatsächlich die Punkte in der Mail durch ihre numerische Zeichenreferenz ersetzt werden sollen - was dazu führt, dass sie im Browser wieder als Punkt verstanden und angezeigt werden - warum ersetzt du dann nicht einfach alle Punkte im Text?

    $output = str_replace('.', '.', $input);

    Der Verzicht auf einen regulären Ausdruck sollte die ganze Sache auch noch ein Stück beschleunigen - str_replace ist für solche einfachen Vorgänge viel schneller.

    - Sven Rautenberg

    1. Hallo Herr Rautenberg,

      Hier ein Beispiel.:
      Ursprungsstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."
      Zielstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."

      $output = str_replace('.', '.', $input);

      Der Verzicht auf einen regulären Ausdruck sollte die ganze Sache auch noch ein Stück beschleunigen - str_replace ist für solche einfachen Vorgänge viel schneller.

      zunächst Danke für Ihre schnelle Antwort. Allerdings habe ich kein Problem mit den generellen Suchen und Ersetzen von Zeichen. In diesem Fall möchte ich aber lediglich die Punkte in der Mail-Adresse ersetzen. Mit str_replace würde ich im Ursprungsstring alle Punkte ersetzen.

      Es wurde dann also aus

      Ursprungsstring: "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."
      Ergebnis-String: "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."

      werden. Dann könne ich aber den Pinkt (".") als Delimiter für die explode-Funktion vergessen. Mein Ziel ist es aber einen Zielstring wie oben aufgeführt zu erhalten.

      Ich schätze ich muss die Texte zunächst in einzelne Worte zerlegen, dann jedes Wort auf eine Mail-Adresse oder URL überprüfen, gegebenenfalls die Punkte ersetzen und dann den Text wieder zusammenfügen. Das ist mir nur etwas I/O-lastig und inperformant. Darum suche ich eine REGEXE, die das übernehmen könnte. So etwas muss auch möglich sein nur fällt bei mir einfach nicht der Groschen wie das funzen könnte.

      Mit freundlichen Grüßen,
      Frank

      1. Hi!

        Ich bin ja meist nicht der Hellste, aber was unterscheidet denn die Punkte von "meine.adresse@example.com", "Version 1.0.1" und "Ich denke. Ich bin."?

        Genau. Saetze werden gewoehnlich durch Leerzeichen getrennt. Nur auf deinen "1. Tag" laesst sich diese profunde Erkenntnis wieder nicht so gut anwenden. ;)

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
    2. Hoi!

      Ich leide unter einer milden Verwirrung. Was genau hat "Saetze in eine DB einlesen" mit Adressspidern zu tun?

      Ich habe das so verstanden dass jeder Satz einzeln gespeichert werden soll. Allerdings birgt dann eben der Beispiel Satz schon ein weiteres Problem: "Am 1. Tag" sind dann schon zwei Saetze.

      --
      "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
            - T. Pratchett
      1. Hoi!

        Ich leide unter einer milden Verwirrung. Was genau hat "Saetze in eine DB einlesen" mit Adressspidern zu tun?

        Ich habe das so verstanden dass jeder Satz einzeln gespeichert werden soll. Allerdings birgt dann eben der Beispiel Satz schon ein weiteres Problem: "Am 1. Tag" sind dann schon zwei Saetze.

        Nee mit Speider hat das NIX zu tun. Genau: Es sollen zusammenhängende Sätze gefunden werden. "1.", "2.", "3." usw. sind kein Problem. Mit

        $text = preg_replace("/((<[^>]*)|[0-9]{1,}.)/ie", '"\2"=="\1"?"\1":"\1PUNKT "', $text);
        $text = preg_replace("/[.]PUNKT/", '&#46;', $text);

        und noch ein paar kleinen semantischen Checks bekommste das weg.

        Gruß,
        Frank

        1. Hola!

          Nee mit Speider hat das NIX zu tun. Genau: Es sollen zusammenhängende Sätze gefunden werden. "1.", "2.", "3." usw. sind kein Problem. Mit

          $text = preg_replace("/((<[^>]*)|[0-9]{1,}.)/ie", '"\2"=="\1"?"\1":"\1PUNKT "', $text);
          $text = preg_replace("/[.]PUNKT/", '&#46;', $text);

          und noch ein paar kleinen semantischen Checks bekommste das weg.

          Na siehste. Wo is denn das Problem, wenn du schon alles hast?

          --
          "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                - T. Pratchett
          1. Na siehste. Wo is denn das Problem, wenn du schon alles hast?

            Leider funzt das nicht bei einer Mail-Adresse oder URL - zumindest habe ich das nicht hinbekommen.

            1. Moin!

              Na siehste. Wo is denn das Problem, wenn du schon alles hast?

              Leider funzt das nicht bei einer Mail-Adresse oder URL - zumindest habe ich das nicht hinbekommen.

              Deine Aufgabenbeschreibung ist ja auch falsch:

              Hier ein Beispiel.:
              Ursprungsstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."
              Zielstring "Am 1. Tag sendete er eine Mail an Herrn&#46;Muster@web&#46;de. Danach waren die Kartoffeln dran."

              Korrekt wäre:

              $input = "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."  
                
              $output = array("Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de.",  
                              "Danach waren die Kartoffeln dran.");  
              
              

              Das Problem liegt nicht in den Punkten in der Mailadresse, sondern in den Punkten innerhalb der normalen Sprache, die keine Satzenden sind.

              Und selbstverständlich kannst du auch noch Pech haben und auf einen Plenker treffen. Dann stehen alle Satzzeichen umhüllt von zwei Spaces.

              Ganz viel Pech bringt dir, wenn du es mit einem Klemper zu tun hast. Der lässt das Leerzeichen nach dem Satzzeichen weg.

              Aber jedenfalls wenn du als Regel akzeptierst, dass ein normaler Satz durch "Punkt-Leerzeichen" getrennt wird: Warum nimmst du nicht einfach genau diesen String als Argument für explode()?

              $saetze = explode(". ", $input);

              Das bringt dir aber natürlich, wie erklärt, Probleme bei "1. Tag". Aber das ist unmöglich mit einfachen Mitteln lösbar, denn eine Zahl kann ja auch legalerweise einfach am Satzende stehen: "Als Zusatzzahl kam die 4. Und Herr Lindemann hatte gewonnen."

              - Sven Rautenberg

              1. Hi,

                Aber jedenfalls wenn du als Regel akzeptierst, dass ein normaler Satz durch "Punkt-Leerzeichen" getrennt wird: Warum nimmst du nicht einfach genau diesen String als Argument für explode()?

                "Weil das z.B. diesen Satz ggf. in 3 Teile schneiden würde." ;-)

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                1. Moin!

                  Aber jedenfalls wenn du als Regel akzeptierst, dass ein normaler Satz durch "Punkt-Leerzeichen" getrennt wird: Warum nimmst du nicht einfach genau diesen String als Argument für explode()?

                  "Weil das z.B. diesen Satz ggf. in 3 Teile schneiden würde." ;-)

                  In dem Satz kommen aber gar keine Mailadressen drin vor. :)

                  - Sven Rautenberg

                2. Hola!

                  "Weil das z.B. diesen Satz ggf. in 3 Teile schneiden würde." ;-)

                  In einem anderen Post hier, habe ich ja schon erwaehnt, dass es sinnvoll ist nach ". " zu suchen, wenn man Saetze trennen will, statt nur nach ".". Auf eine andere Bemerkung dass sowas wie "Am 1. Tag" schon 2 Saetze ergibt, meinte der Threadersteller dann ja, das waere alles kein Problem.

                  Ich gehe also mal davon aus, dass dein obiger Satz ihm keine Probleme bereitet und wundere mich daher warum es ihm Probleme bereitet Mailadressen nicht zu trennen.

                  Manchmal verstehe ich die Fragesteller einfach nicht.

                  --
                  "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                        - T. Pratchett
      2. Moin!

        Ich leide unter einer milden Verwirrung. Was genau hat "Saetze in eine DB einlesen" mit Adressspidern zu tun?

        Das passiert, wenn die Problembeschreibung die falschen Synapsen aktiviert.

        Das Problem wurde nicht als "wie kriege ich Sätze auseinandergefummelt" beschrieben, sondern es wurde eine unzureichende Ersatztaktik angewandt, die nach meinem Erfahrungswert eher in Richtung Spiderschutz ging.

        - Sven Rautenberg

  2. Hallo Frank,

    Ursprungsstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."

    gem. der Aufgabenstellung ist grds. fragl., ob Dein Vorhaben scheitern muss. W. o. zu sehen ist, würde explode() ber. "Am 1" als Satz erk.. Aber mal ganz abgesehen dav., was machst Du mit Abkürzungen?

    Gruß aus Berlin!
    eddi

    1. Hallo Frank,

      Ursprungsstring "Am 1. Tag sendete er eine Mail an Herrn.Muster@web.de. Danach waren die Kartoffeln dran."

      gem. der Aufgabenstellung ist grds. fragl., ob Dein Vorhaben scheitern muss. W. o. zu sehen ist, würde explode() ber. "Am 1" als Satz erk.. Aber mal ganz abgesehen dav., was machst Du mit Abkürzungen?

      Gruß aus Berlin!
      eddi

      Hi Eddi,

      Akronyme sind kein Problem. Die sind ja bekannt; Habe ich über eine eigene Funktion abgefackelt. Meine Anwendung läuft jedenfalls. Seit einiger Zeit sind in den Texten aber Mails und URLs "zugelassen" - dass macht mit leider Kopfzerbrechen.

      Gruß,
      Frank

      1. Re:

        Akronyme sind kein Problem. Die sind ja bekannt; Habe ich über eine eigene Funktion abgefackelt.

        Bei über 40000 an der Zahl hege ich daran meine Zweifel, aber was soll's.

        Meine Anwendung läuft jedenfalls. Seit einiger Zeit sind in den Texten aber Mails und URLs "zugelassen" - dass macht mit leider Kopfzerbrechen.

        Reguläre Ausdrücke ist etwas, wovor ich mich allermeist sehr erfolgreich gedrückt habe. In Deinem Fall würde ich mittels $text=explode('@',$text); mail-Adressen bestimmen. Sagen wir, _eine_ sei im Text enthalten. So ist der erste Teil der mail dann dadurch bestimmt, dass dieser nach dem letzten Vorkommen von " " in $text[0] beginnt. Das lässt sich relativ simple in einer Schleife einbauen und durch strrpos() und substr() zurechtfriemeln, wo dann auch der letze Teil der Mail in $text[$n+1], ähnlich simpel wie oben, gesucht werden kann. Klar, bei $text[$n] für $n==count($text)-1; muss man dann gesondert aufpassen, da die Mail am Ende des Textes stehen kann.

        Selbes kannst Du auch mit URLs veranstalten. $text=explode('://',$text);

        Gruß aus Berlin!
        eddi