2009-11-25 9 views
19

Mein Text-String sieht wie folgt aus extrahieren:regex Mit Benutzernamen von E-Mail-Adresse

[email protected] (John Doe) 

ich vor dem @ und nichts anderes nur die Rolle bekommen müssen. Der Text stammt von einem einfachen XML-Objekt, wenn es darauf ankommt.

Der Code Ich habe sieht wie folgt aus:

$authorpre = $key->{"author"}; 
$re1 = '((?:[a-z][a-z]+))'; 

if ($c = preg_match_all ("/".$re1."/is", $authorpre, $matches)) 
{ 
    $author = $matches[1][0]; 
} 

Manchmal könnte der Benutzername haben Zahlen oder einen Unterstrich vor dem @ -Zeichen, das ist, wo die regex hält es scheint.

+0

Ihr regexp hat eine äußere Erfassungsgruppe '()' und eine innere Nicht-Erfassung Gruppe '(:)'. Die innere nicht einfangende Gruppe ist möglicherweise unnötig, da Sie erfassen möchten, was sich darin befindet. Das '[a-z]' bedeutet, einen Kleinbuchstaben zu erfassen. Das '[a-z] +' bedeutet, dass 1 oder mehr Kleinbuchstaben erfasst werden. Effektiv bedeutet Ihr Ausdruck, dass Sie alles erfassen, was 2 oder mehr Kleinbuchstaben lang ist. Wenn Sie ein "^" ganz vorne in Ihren Ausdruck einfügen, wird sichergestellt, dass die Übereinstimmung nur vom Anfang des Texts aus erfolgt. –

+0

Wird nicht sehr viel Spaß machen, fürchte ich. Einige Beispiel-Strings, die Sie vielleicht testen möchten: "" John Doe "@ example.com (John Doe)', '"(>'.')>"@example.com (John Doe)', 'foo @ [192.168. 2.1] (John Doe) ', '^.^@example.com (John Doe)', '" [email protected]@c"@example.com (John Doe) "'. Ja, das sind alles gültige E-Mails Adressen :-) – Joey

+0

@Johannes: '" [email protected]@c"@example.com (John Doe) 'ist wirklich erlaubt? Das macht die Dinge wirklich kompliziert ... – Welbog

Antwort

59

Der reguläre Ausdruck, die jeden Charakter passen und erfassen, bis sie den @ Charakter erreicht:

([^@]+) 

Das scheint wie das, was Sie brauchen. Es wird alle Arten von freaky Variationen über E-Mail-Adressen behandeln.


Ich bin mir nicht sicher, warum Ben James seine Antwort gelöscht, da ich es besser fühlen als meine. Ich werde es hier posten (es sei denn, er löscht seine Antwort):

Warum Regex anstelle von String-Funktionen verwenden?

$parts = explode("@", "[email protected]"); 
$username = $parts[0]; 

Sie brauchen keine reguläre Ausdrücke in dieser Situation überhaupt. Ich denke, mit explode ist eine viel bessere Option, persönlich.


Als Johannes Rössel weist darauf hin, in den Kommentaren, ist Adresse Parsing E-Mail ziemlich kompliziert. Wenn Sie 100% ig sicher sein wollen, dass Sie mit jeder technisch gültigen E-Mail-Adresse umgehen können, müssen Sie eine Routine schreiben, die das Zitieren richtig behandelt, weil beide in meiner Antwort aufgelisteten Lösungen sich ersticken Adressen wie "[email protected]"@example.com. Es kann eine Bibliothek geben, die diese Art von Analyse für Sie übernimmt, aber ich bin mir dessen nicht bewusst.

+0

je nachdem, wie intensiv Ihre Regex kann, mag ich persönlich explodieren Funktion. Passt gut mit, was Sie suchen. –

+2

Was ist mit der E-Mail-Adresse '" a @ b "@ example.com'? – Joey

+1

Der Spaß endet nie mit Quell-Routen in E-Mail-Adressen: http://www.remote.org/jochen/mail/info/address.html –

2

würde ich mit $author = str_replace(strrchr($authorpre, '@'), '', $authorpre);

2

gehen Sie mithilfe von mailparse_rfc822_parse_addresses beginnen könnte die Adresse und extrahieren nur die Adressangabe ohne Anzeigenamen zu analysieren. Dann könnten Sie den Teil vor @ mit dem Regexp (.*)@ extrahieren.

2

@OP, wenn Sie nur alles vor @ bekommen wollen, verwenden Sie einfach string/array-Methoden. Keine Notwendigkeit, komplizierte Regex.Explodieren Sie auf „@“, dann entfernen Sie das letzte Element, das den Domänenteil ist

$str = '"[email protected]@doe"@domain.com (John Doe)'; 
$s = explode("@",$str); 
array_pop($s); #remove last element. 
$s = implode("@",$s); 
print $s; 

Ausgang

$ php test.php 
"[email protected]@doe" 
3

Vielleicht ist diese Variante etwas langsamer als explode(), aber es dauert nur eine Saite:

$name = preg_replace('/@.*?$/', '', $email); 
1

Verwendung so etwas wie dieses:

list($username, $domain) = explode('@', $email . "@"); // ."@" is a trick: look note below 

Mit dieser Lösung haben Sie bereits zwei Variablen mit E-Mail-Adressteilen in einer Zeile gefüllt.

."@": Dies wird gemacht, um kurze kritische Fehler mit dem Befehl list zu vermeiden und sicherzustellen, dass explode mindestens zwei Variablen nach Bedarf erzeugt.

1
<?php 
$email = '[email protected]'; 
$domain = strstr($email, '@'); 
echo $domain; // prints @example.com 

$user = strstr($email, '@', true); // As of PHP 5.3.0 
echo $user; // prints name 
?> 

source

0

Grund Beispiel:

$email = "[email protected]"; 
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     list($user, $domain) = explode('@', trim($email) . "@"); 
    } else { 
     echo "Unable to get account info ...."; 
    } 

Komplexes Beispiel: So etwas Vorname und Nachname Felder zu füllen:

1) valid email ? if yes get the two parts user and domain. 
2) else set to something default etc. 
3) use the email address if we don't have a decoded value. 

Code:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     list($fname, $lname) = explode('@', trim($email) . "@"); 
    } else { 
     $fname = "Xdefault"; 
     $lname = "Ydefault"; 
    } 

    $fname = (!empty($decoded['firstname'][0])) ? $decoded['firstname'][0] : $fname ; 
    $lname = (!empty($decoded['lastname'][0])) ? $decoded['lastname'][0] : $lname ; 
0

Mein Vorschlag:

$email = '[email protected]'; 
$username = substr($email, 0, strpos($email, '@')); 

// Output (in $username): johndoe 
Verwandte Themen