kostenloser Webspace werbefrei: lima-city


Hilfe bei regulären Ausdrücken

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    mrjack

    mrjack hat kostenlosen Webspace.

    Hallo
    Ich habe als String einen bestimmten Text einer Mail, z.B.:

    ----- Original Message -----
    From: Max Mustermann
    To: MrJack
    Sent: Monday, April 30, 2007 8:51 PM
    Subject: Testmail

    Mailtext .....


    Jetzt möchte ich diesen Text nach dem Absender durchsuchen, d.h. im Endeffekt sollte "Max Mustermann" gefunden werden.

    Das müsste doch mit regulären Ausdrücken möglich sein, nur leider kenn ich mich damit nicht aus.
    Kann mir jemand helfen?

    Danke

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Wenn du den Absender extrahieren willst, sollte folgender Reggex das erledigen:

    /^From: (.+)\n$/

    Übersetzung: Am Anfang einer Zeile steht "From: " gefolgt von beliebigen Zeichen, die gespeichert werden sollen bis zu einem Zeilenumbruch am Ende der Zeile.

    nicht getestet.
  4. *hust*
    Für den Fall, dass die komplette Datei als PHP-Variable $mail im Speicher liegt.

    Ich würde den Anfang- und den Endbegrenzer weglassen, alle (theoretisch möglichen) Zeilenumbruchzeichen prüfen und den Modifikator '/i' verwenden:


    $pcre = '/from\:\s+(.+)(\r\n|\n|\r)/i'
    $from = preg_match($rx, $mail, $treffer) ? $treffer[1] : FALSE;

    /i: ignoriert Groß- oder Kleinschreibung bei "From".
    \s+: fängt Leerzeichen vor dem Absendernamen ein.

    Und da ich nicht weiß, wo die "Mail" herkommt[1] (beim Speichern als Datei kann gar Wunderliches passieren), geh ich lieber auf Nummer sicher und frag alle Zeilen-End-Begrenzungen ab: DOS/Windoof "\r\n", Unix-Like "\n" und (eher unwahrscheinlich) Uralt-Mac "\r".

    Falls du die Zeilen alle einzeln vorliegen hast, kannst du auf /s verzichten und '(\r\n|\n|\r)' durch '\^Z' ersetzen oder auch ganz weglassen ...

    ... und, nein, ich hab das auch nicht extra getestet ...

    ====
    [1] ... und weil ich paranoid bin ... ;-)

    Ach und: Das mit dem Modifikator "/s" war natürlich Quatsch, deshalb hab ich den wieder rausgeschmissen ...

    Beitrag geaendert: 17.5.2007 11:59:17 von alopex
  5. @mrjack: habe dir doch im Thread "Mails verschieben" ( http://www.lima-city.de/boards/post/558116 ) schon ein Script angegeben, dass die Mail-Header ausliest...

    In dem folgenden Teilstück...
    <?
        // Codeschnipsel (nicht vollständig)
    
        echo '<br>\nMessage '.$num.'<br>\n';
        foreach ($msg['header'] as $harr) {
            foreach($harr as $hname => $hvalue) {
                echo '  '.$hname.' = '.$hvalue.'<br>\n';
            }
        } 
    ?>

    ...brauchst du eigentlich dann nur in der Schleife schauen, ob $hname == "From:" ist. Wenn ja, dann merke dir $hvalue in einer anderen Variable ;-)

    Grüßle

    Beitrag geaendert: 15.5.2007 13:07:13 von scout
  6. Autor dieses Themas

    mrjack

    mrjack hat kostenlosen Webspace.

    Im Header steht ja ein anderer Name, als der, den ich suche.
    Im Mail unter ---Original Message--- steht der Name des ursprünglichen Mail-Schreibers. Den will ich haben. Der steht nicht im Header.

  7. Im Header steht ja ein anderer Name, als der, den ich suche.
    Im Mail unter ---Original Message--- steht der Name des ursprünglichen Mail-Schreibers. Den will ich haben. Der steht nicht im Header.


    Ob der nicht auch immer Header steht ? gewangte Aussage. Ehrlich gesagt
    keine Ahnung. ähm und was das Skript da oben machen soll frag ich mich
    wirklich ?! Hat absolut nichts mit dem gewünschten Ergebnis zu tun
    er wollte ienen Regulären ausdruck und den bekommt er auch!

    alopex schrieb:
    $pcre = '/from\:\s+(.+)(\r\n|\n|\r)/si'
    $from = preg_match($rx, $mail, $treffer) ? $treffer[1] : FALSE;

    der dürfte alles können was du brauchst und noch mehr!
  8. @sirseven: ich weiß an welchem Projekt mrjack arbeitet, deshalb hab ich ein Codeschnipsel zum Projekt eingestellt, weil ich dachte er möchte den Absender der eMail haben.

    So wie es aussieht, will er aber allerdings aus einer weitergeleiteten eMail den Absender haben und der steht natürlich nicht im Header ;-)

    Ok und das dürfte mit deinem Reg-Ausdruck gehen (ungetestet).

    Grüßle
  9. Autor dieses Themas

    mrjack

    mrjack hat kostenlosen Webspace.



    Im Header steht ja ein anderer Name, als der, den ich suche.
    Im Mail unter ---Original Message--- steht der Name des ursprünglichen Mail-Schreibers. Den will ich haben. Der steht nicht im Header.


    Ob der nicht auch immer Header steht ? gewangte Aussage. Ehrlich gesagt
    keine Ahnung. ähm und was das Skript da oben machen soll frag ich mich
    wirklich ?! Hat absolut nichts mit dem gewünschten Ergebnis zu tun
    er wollte ienen Regulären ausdruck und den bekommt er auch!

    alopex schrieb:
    $pcre = '/from\:\s+(.+)(\r\n|\n|\r)/si'
    $from = preg_match($rx, $mail, $treffer) ? $treffer[1] : FALSE;

    der dürfte alles können was du brauchst und noch mehr!


    Danke für eure Antworten, aber irgendwie komme ich nicht zum gewünschten Ergebnis. Ich werde mein Problem neu umschreiben.

    Übrigens: Müsste der Ausdruck nicht so lauten?
    preg_match($pcre, $mail, $treffer)

    Im Quelltext (wenn ich die $mail-Variable ausgebe) steht folgendes:

    <DIV style="FONT: 10pt arial">----- Original Message -----
    <DIV style="BACKGROUND: #e4e4e4; font-color: black"><B>From:</B> <A
    title=max.mustermann@mail.at href="mailto:max.mustermann@mail.at">Max Mustermann</A>

    </DIV>
    <DIV><B>To:</B> <A title=...
    ...

    Die Zeilenumbrüche sind auch so vorhanden (z.B. nach dem <A in der 2. Zeile)
    Und da will ich entweder die Mailadresse oder den Namen herausfiltern.

    Danke für eure Hilfe

    Beitrag geaendert: 17.5.2007 11:49:36 von mrjack
  10. Du solltest vor der Suche mit preg_match() mal die Funktion strip_tags() drüberjagen:

    http://de.php.net/manual/de/function.strip-tags.php

    Die entfernt alle Tags und lässt nur Klartext übrig.

    ... und falls du dann meine oben angegebene Lösung verwenden solltest (wenn sie denn halbwegs funktioniert), dann wirst du den Modifikator "/s" wieder anhängen müssen[1], denn zwischen dem "From:" und dem Rest taucht ja ein Zeilenumbruch auf.

    Wenn dir das mit den Zeilenumbrüchen zu umständlich ist, dann kannst du auch nach "from:" und "to:" suchen und alles, was dazwischen liegt, als Absender nehmen (nachdem du trim() drauf angesetzt hast). Das setzt aber voraus, dass "to:" in allen Mails nach "from:" kommt ...

    $plain_mail = strip_tags($mail); 
    $pcre = '/from:(.+?)to:/is';
    $from = preg_match($pcre, $plain_mail, $treffer) ? trim($treffer[1]) : FALSE;


    An die Mail-Adresse kommst du so leider nicht ran. Die steht ja nur im HTML-Quelltext. Daher müsstest du kucken, was zwischen "from:" und "to:" hinter bleistiftsweise "href=" steht:

    $pcre = '/from:(.+?)href=(["\']?)([^\2]+)\2(.+?)to:/is';
    $from_mail_address = preg_match($pcre, $mail, $treffer) ? $treffer[3] : FALSE;


    Hoffe, das funktioniert auf Anhieb. Da Lima doppelte Hochkommas gerne in einfach e konvertiert, hab ich gleich beide Varianten (und auch die ganz ohne) erfasst.

    ================

    [1] Ich hab ihn grad weggemacht, weil ich nicht wusste, dass dein $mail Zeilenumbrüche zwischen "From:" und dem Absender hat ...^^

    [2] Ja, ich hab früher immer $rx statt $pcre als "Standard-Variablennamen" benutzt. Deshalb komm ich manchmal durcheinander. Das Gleiche gilt übrigens für $treffer/$matches. Damit meine ich meistens das Gleiche ...^^

    [3] Der :(-Smiley war nicht beabsichtigt. Es handelt sich hier um ":" und "(". Hol dir den Quelltext am besten, indem du auf "Zitieren" klickst ... :wink:

    Beitrag geaendert: 17.5.2007 12:13:17 von alopex

    Beitrag geaendert: 17.5.2007 12:20:05 von alopex
  11. Autor dieses Themas

    mrjack

    mrjack hat kostenlosen Webspace.

    Danke! Das mit dem Namen funktioniert jetzt einwandfrei!

    Nur bei der Mailadresse gibt es noch Probleme
    Da wird folgendes ausgegeben:

    max.mustermann@mail.at">Max Mustermann
    To:

    Edit:
    Und da habe ich gleich noch eine Frage:
    Wie entferne ich dann den gesamten ----Original Message---- Teil am Anfang der Mail. Nehmen wir an, der Aufbau sieht (fast) immer gleich aus:

    ----- Original Message -----
    From:
    To: (mehrere Adressen möglich)
    CC: (nicht immer present, ist aber möglich)
    Sent: Zeit
    Subject: Betreff

    Ich möchte diesen ganzen Teil löschen.

    Beitrag geaendert: 17.5.2007 14:21:59 von mrjack
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!