Seite 1 von 1
Regex und Mailheader
Verfasst: 08.09.2012, 21:17
von 13pixelchen
Hallo,
ich möchte aus dem Mailquelltext den From-Header extrahieren, der sieht ja so aus:
From: abcöäü <
mail@mail.de>
oder auch so:
From: "abcöäü" <
mail@mail.de>
Habe das hier versucht was nicht funktioniert:
#\^From: [^<]* <(.*)>\]#m
Hat jemand bessere Ideen?
Verfasst:
von
SEO Consulting bei
ABAKUS Internet Marketing Erfahrung seit 2002
- persönliche Betreuung
- individuelle Beratung
- kompetente Umsetzung
Jetzt anfragen:
0511 / 300325-0.
Verfasst: 08.09.2012, 23:00
von Melegrian
Der Ausdruck an sich ist nicht das Problem, nur je nachdem was Du da benutzt, solltest Du beim Einlesen Hochkomma maskieren.
Code: Alles auswählen
<?php
$string = "From: \"abcöäü\" <mail@mail.de>";
$muster = "/From:(.+)<(.+)\.(\w){2,4}>/i";
preg_match($muster, $string, $ausgabe);
echo htmlspecialchars($ausgabe[0])."\n";
// Ausgabe: From: "abcöäü" <mail@mail.de>
?>
Kommt aber darauf an, wie Du die ein- und auslesen möchtest, beim Durchsuchen von Dateien ist es nicht zwingend erforderlich.
Code: Alles auswählen
<?php
$datei = fopen("abc.html", "r");
$muster = "/From:(.+)<(.+)@([-\w]+)\.([a-z]){2,4}>/i";
while (!feof($datei)) {
$suche_in= fgets($datei, 1000);
if (stripos($suche_in, "from:")!== false) {
preg_match($muster, $suche_in, $ausgabe);
echo htmlspecialchars($ausgabe[0])."\n";
}
}
fclose ($datei);
?>
Habe jetzt mal beide Ausdrücke etwas abgewandelt, der letztere gefällt mir etwas besser, obwohl der erste Ausdruck genügen sollte.
Verfasst: 09.09.2012, 10:41
von 13pixelchen
Habs nochmal abgewandelt zu /From: ((.+)@([-\w]+)\.([a-z>]){2,5})/i
Verfasst: 09.09.2012, 10:56
von 13pixelchen
Allerdings tuts dann für .co.uk nicht.
Verfasst: 09.09.2012, 13:36
von Melegrian
13pixelchen hat geschrieben:Habs nochmal abgewandelt zu /From: ((.+)@([-\w]+)\.([a-z>]){2,5})/i
Bei Aufnahme von > in einer Zeichenklasse spielt die Reihenfolge der in der Zeichenklasse enthaltenen Zeichen keine Rolle mehr und der Teilausdruck würde auch mit .a>bcd übereinstimmen. Der Teilausdruck \.([a-z]){2,4}> passt hingegen nur auf .ab> bis .abcd>.
Damit der Ausdruck auch auf .co.uk passt, nimmst Du den Punkt noch einen Teilausdruck weiter vorn auf bei ([-.\w]+).
Die Datei abc.html enthält:
Code: Alles auswählen
Erste Zeile ...
From: "abcöäü" <mail@mail-_mail.de>
Dritte Zeile ...
From: "abcöäü" <mail@mail-_mail.co.uk>
Fünfte Zeile ...
Ausgabe getestet mit:
Code: Alles auswählen
<?php
$datei = fopen("abc.html", "r");
$muster = "/From:(.+)<(.+)@([-.\w]+)\.([a-z]){2,4}>/i";
while (!feof($datei)) {
$suche_in= fgets($datei, 1000);
if (stripos($suche_in, "from:")!== false) {
preg_match($muster, $suche_in, $ausgabe);
echo htmlspecialchars($ausgabe[0])."<br>\n";
}
}
fclose ($datei);
/*
Ausgabe:
From: "abcöäü" <mail@mail-_mail.de>
From: "abcöäü" <mail@mail-_mail.co.uk>
*/
?>
Und was hast Du damit vor? Ich hoffe, ich helfe Dir hier nicht bei Schandtaten, die in einer Grauzone liegen.
Verfasst: 09.09.2012, 13:44
von 13pixelchen
Ich will eingehende Mails automatisch in eine Datenbank kloppen. Ich habs geändert zu /From: ((.+)@([-\w]+)\.([a-z>\.])*)/i so das auch "From:
mail@mail.de" erfasst wird, quasi einfach alles bis zum Ende der Zeile. Danke für Deine Hilfe. Tipp:
https://www.myregextester.com/