2010-02-24 14 views
8

Ho la seguente stringaRegex: come rimuovere la posta elettronica prima del simbolo "@"?

First Last <[email protected]> 

vorrei estrarre

"first.last" 

dalla stringa di posta elettronica utilizzando espressioni regolari & PHP. Come andare su questo?

Grazie in anticipo!

+0

Osservando le risposte, è possibile notare che '" e \ @w "@ example.com' è, tecnicamente, un indirizzo email valido. – Erik

+0

Appena realizzato c'era molto di più nella stringa oltre al semplice indirizzo email. –

+0

È possibile trovare ['s ($ str) -> beforeLast ('@')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L399) utile, come trovato in [questa libreria standalone] (https://github.com/delight-im/PHP-Str). – caw

risposta

5

So che la risposta è stata accettata, ma questo funziona su qualsiasi indirizzo di posta elettronica valido nel formato: Name <[email protected]>

// Yes this is a valid email address 
$email = 'joey <"[email protected]"@example.com>'; 

echo substr($email, strpos($email,"<")+1, strrpos($email, "@")-strpos($email,"<")-1); 
// prints: "[email protected]" 

La maggior parte delle altre soluzioni postato falliranno su una serie di validi indirizzi email.

2

Non è possibile utilizzare una funzione di divisione? Non uso PHP ma sembra che sarebbe molto più semplice se fosse disponibile.

1

Se questo è il formato esatto si otterrà, quindi la corrispondenza con l'espressione regolare

/<([^@<>]+)@([^@<>]+)>/ 

vi darà esempio first.last nel gruppo di cattura 1 e email.com nel gruppo di cattura 2.

+0

Si noti che questo soffoca su indirizzi e-mail contenenti più @ s. Dubito che questo sia un problema per la stragrande maggioranza degli utenti - e in questo caso, una soluzione che funziona il 99,9% delle volte richiede meno dello 0,1% dello sforzo richiesto per far funzionare correttamente l'ultimo 0,1%. –

+0

con/un po '/ più lavoro, puoi trovare l'ultimo @ nella stringa sapendo che, secondo la RFC, il nome è la parte prima di quella finale @. – Erik

5
$str ="First Last <[email protected]>"; 
$s = explode("@",$str); 
$t = explode("<",$s[0]); 
print end($t); 
+0

Ghostdog, mi piace anche questa soluzione, ma ad essere sinceri la mia domanda ha chiesto una regex. Ma comunque la tua soluzione funziona alla grande, grazie per la tua risposta! – st4ck0v3rfl0w

+0

A proposito, che cosa fa print end()? – st4ck0v3rfl0w

+0

abbastanza giusto. È la vostra scelta. Ho appena presentato un'alternativa più semplice, per il tuo particolare campione di corde. end ($ t) è l'ultimo elemento dell'array. controlla i documenti PHP per ulteriori informazioni – ghostdog74

0

Non c'è bisogno di utilizzare regexp; molto più efficiente usare alcune semplici funzioni stringa.

$string = 'First Last <[email protected]>'; 
$name = trim(substr($string, 0, strpos($string, '<'))); 
+0

Tranne che stai ricevendo "First Last" come risultato, non "first.last" – Erik

3

Questo è molto più facile (dopo aver verificato che l'e-mail è valido):

 
$email = '[email protected]'; 
$split = explode('@',$email); 
$name = $split[0]; 
echo "$name"; // would echo "my.name" 

Per verificare la validità, si potrebbe fare questo:

 
function isEmail($email) { 
    return (preg_match('/[\w\.\-][email protected][\w\.\-]+\.\[w\.]/', $email)); 
} 
if (isEmail($email)) { ... }

Come per estrarre l'e-mail di First Last <[email protected]> ,

 
function returnEmail($contact) { 
    preg_match('\b[\w\.\-][email protected][\w\.\-]+\.\[w\.]\b', $contact, $matches); 
    return $matches[0]; 
} 
Problemi correlati