Email-Adressen aus String extrahieren

Hallo,
ich muss aus einem String mit einer oder mehreren Email-Adressen die Email-Adressen herausholen. Die einzelnen Email Adressen sind durch Komma voneinander getrennt. Dabei duerfen aber Kommas, die sich in einer „…“-Zeichenkette befinden nicht beruecksichtigt werden.

Beispielstring (mit allen mir bekannten Formen):
„Mueller, Peter“ ,„Peter Mueller“ ,[email protected]

Die sollen anschliessend alle als reine Emailadressen in einem Array stehen. Es kann aber auch nur eine Email sein oder hundert…

Bei der Extrahierung der einzelnen Adressen hilft mir
$email =~ /([^\s,’"@]+@[A-z0-9-.!]+)(.*)/;

Das Hauptproblem ist das Komma im ersten Namen(so was kann natuerlich auch mehrmals vorkommen), sonst koennte man der String ja leicht splitten und das Array dann eins nach dem anderen bearbeiten.

Hat da jemand eine Idee, wie ich die Emails sauber herausbekomme?

Christian

<?php $beispiel = "\"Mueller, Peter\" ,"; $beispiel.= "\"Peter Mueller\""; $beispiel.= ","; $beispiel.= " Ausgabe: Array ( [0] =\> [[email protected]](mailto:[email protected]) [1] =\> [[email protected]](mailto:[email protected]) [2] =\> [[email protected]](mailto:[email protected]) [3] =\> [[email protected]](mailto:[email protected]) [4] =\> [t\[email protected]](mailto:[email protected]) )

Hallo

Hab ich dich richtig verstanden, dass aus

"Mueller, Peter" ,"Peter Mueller" ,,[email protected]

das hier werden soll:

[0] =\> "Mueller, Peter" 
[1] =\> "Peter Mueller" 
[2] =\> 
[3] =\> [email protected]

Das lässt sich mit regex wohl nicht machen.
Mir fällt da folgende Lösung ein (ungetestet):

$quoted=false;
k=0;
$result[0]='';
for(i=0;i\>strlen($string);i++)
{
if ($string[i] == '"') $quoted = (!$quoted);
elseif (($string[i] == ',') and (!$quoted)) $result[++$k]='';
else $result[$k] .= $string[i];
}

Johannes

Hallo Chris!
Ich würde die einzelnen Adressen einfach mit einem anderen Zeichen trennen.
„Mueller, Peter“ ~„Peter Mueller“,~[email protected]

Und dann eben per explode() in ein Array einlesen…
Hoffe, ich konnte helfen…
Maik

Hallo,

Hat da jemand eine Idee, wie ich die Emails sauber
herausbekomme?

Wenn Deine spezifikation vollständig ist und
es nicht um die Validierung sondern nur um
die Extraktion geht, könntest Du, je nach
dem, wie Du die Adressen haben willst, so
was machen:

$emails = '„Mueller, Peter“ ,„Peter Mueller“ ’
. ‚,[email protected]‘;

$addressen = array_map(
create_function(
‚$e‘,
‚preg_match(‘/([^]*)/’, $e, $m);
return Array($m[2] ? $m[2] : $m[1], $e);’
),
preg_split(’/(?),/’, $emails)
);

print_r($addressen);

(Obwohl das natürlich beim Adressen-Splitten etwas geschummelt ist :wink:

Grüße

CMБ

Hallo
Das geht aber nur, wenn jeder Eintrag mit > endet (die letzte Adresse ausgenommen)
Für folgende Liste funktioniert es also nicht:

$emails = ‚„Mueller, Peter“ ,„Peter Mueller“ ’
.‘,[email protected],[email protected]’;

Johannes