Hilfe bei regulären Ausdrücken
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
absender
ahnung
ausdruck
aussagen
beitrag
endeffekt
folgenden teilstck
gewnschten ergebnis
komplette datei
message
nummer
schreiber
scout
skript
speicher
variable
verzicht
vollstndig echo
weitergeleiteten email
zeile
-
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
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
*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 -
@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 -
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. -
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! -
@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 -
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 -
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 ...
Beitrag geaendert: 17.5.2007 12:13:17 von alopex
Beitrag geaendert: 17.5.2007 12:20:05 von alopex -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage