2010-10-10 9 views
24

Ho un blocco di testo dal quale voglio estrarre gli indirizzi e-mail validi e inserirli in un array. Finora ho ...In PHP, come posso estrarre più indirizzi e-mail da un blocco di testo e inserirli in un array?

$string = file_get_contents("example.txt"); // Load text file contents 
    $matches = array(); //create array 
    $pattern = '/[A-Za-z0-9_-][email protected][A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/'; //regex for pattern of e-mail address 
    preg_match($pattern, $string, $matches); //find matching pattern 

Tuttavia, sto ricevendo un array con un solo indirizzo. Pertanto, suppongo di dover scorrere questo processo in qualche modo. Come lo faccio?

risposta

11

Il codice è quasi perfetto, basta sostituire preg_match(...) con preg_match_all(...)

http://www.php.net/manual/en/function.preg-match.php

http://www.php.net/manual/en/function.preg-match-all.php

+0

Grazie mille !! Mi sto avvicinando ora. La mia uscita tuttavia mi sembra un po 'strana. Mi sembra di ottenere array all'interno dell'array come segue: Array ([0] => Array ([0] => example @ slu.edu) [1] => Array ([0] => edu)) – HumbleHelper

+0

Sto cercando semplicemente un array con ogni chiave contenente un indirizzo e-mail. – HumbleHelper

+1

@HumbleHelper preg_replace_all creerà nuovi elementi di array per il submatch di tutto ciò che era tra parentesi nel modello originale. Hai avuto parentesi intorno all'ultima parte è il dominio nel modello. Per risolvere questo problema puoi semplicemente aggiungere $ matches = $ matches [0] alla fine. Inoltre, guarda la risposta di Clay Hinson. Merita la risposta accettata. – stevendesu

18

So che questa non è la domanda che hai chiesto, ma ho notato che la vostra espressione regolare non accetta qualsiasi indirizzo come '[email protected]' o qualsiasi indirizzo con un sottodominio. Si potrebbe sostituirlo con qualcosa di simile:

/[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}/ 

che rifiutano e-mail meno valido (anche se non è perfetto).

Suggerisco anche di leggere this article on e-mail validation, è abbastanza buono e informativo.

+1

Grazie per la tua opinione! Ho usato la risposta @Clay Hinson ma non ha funzionato con i sottodomini. Ho unito le 2 risposte e ho capito: "/[a-z0-9_.\-\+]{1,256}[email protected][a-z0-9\-\.]+\.([az]{2, 4})/i "Ho usato strtolower() su email var, quindi non richiede AZ – jaysponsored

+0

Sei fantastico! –

+0

Questa espressione regolare funziona, quella della risposta @Clay Hinson non è – Crasher

28

Sei vicino, ma la regex non cattura tutti i formati di posta elettronica e non è necessario specificare A-Za-z, puoi semplicemente usare il flag "i" per contrassegnare l'intera espressione come maiuscole e minuscole. Ci sono casi in formato e-mail che mancano (specialmente i sottodomini), ma questo cattura quelli che ho provato.

$string = file_get_contents("example.txt"); // Load text file contents 

// don't need to preassign $matches, it's created dynamically 

// this regex handles more email address formats like [email protected], and the i makes it case insensitive 
$pattern = '/[a-z0-9_\-\+][email protected][a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i'; 

// preg_match_all returns an associative array 
preg_match_all($pattern, $string, $matches); 

// the data you want is in $matches[0], dump it with var_export() to see it 
var_export($matches[0]); 

uscita:

array (
    0 => '[email protected]', 
    1 => '[email protected]', 
    2 => '[email protected]', 
    3 => '[email protected]', 
    4 => '[email protected]', 
) 
+0

+1 per maggiori dettagli rispetto alla mia risposta, codice di esempio e un pattern che cattura i sottodomini. Questa dovrebbe essere accettata risposta. – stevendesu

+0

Sì! .. funziona bene ... – VKGS

+3

Questa soluzione è bacata a meno che non la aggiusti. L'espressione regolare precedente interrompe le email di tipo '[email protected]' dove l'ultima parte è composta da 4+ caratteri. Si regex restituisce '[email protected]'. Per favore aggiusta. – Eye

1

Questa espressione regolare estrarre tutti gli indirizzi e-mail univoco da un URL o un file e l'output ciascuno in nuova linea. Prenderà in considerazione tutti i sottodomini e problemi di suffisso prefisso. Trova comodo per usarlo.

<? 
$url="http://example.com/"; 
$text=file_get_contents($url); 
$res = preg_match_all(
"/[a-z0-9]+[_a-z0-9\.-]*[a-z0-9][email protected][a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/i", 
$text, 
$matches 
); 
if ($res) { 
foreach(array_unique($matches[0]) as $email) { 
echo $email . "<br />"; 
} 
} 
else { 
echo "No emails found."; 
} 
?> 

assegno qui per più di riferimento: http://www.php.net/manual/en/function.preg-match-all.php

4

Questo rileva tutti gli indirizzi di posta elettronica:

$sourceeee= 'Here are examplr [email protected] and [email protected] or something more'; 

preg_match_all('/[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}/i', $sourceeee, $found_mails); 

quindi è possibile utilizzare $found_mails[0] array.

0

ha funzionato meglio per me:

<?php 
$content = "Hi my name is Joe, I can be contacted at [email protected]"; 
preg_match("/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/i", $content, $matches); 
print $matches[0]; 
?> 

Alcuni degli altri non ha accettato domini come: [email protected]

ho trovato su: http://snipplr.com/view/63938/

0

Questo la funzione funziona bene senza usare espressioni regolari. Quindi è molto più veloce e ha fame di risorse basse.

<?php 
function extract_email_addresses($str){ 
    $emails = array(); 
    $str = strip_tags($str); 
    $str = preg_replace('/\s+/', ' ', $str); 
    $str = preg_replace("/[\n\r]/", "", $str); 
    $remove_chars = array (',', "<", ">", ";", "'", ". "); 
    $str = str_replace($remove_chars, ' ', $str); 
    $parts = explode(' ', $str); 
    if(count($parts) > 0){ 
     foreach($parts as $part){ 
      $part = trim($part); 
      if($part != '') { 
       if(filter_var($part, FILTER_VALIDATE_EMAIL) !== false){ 
        $emails[] = $part; 
       }     
      } 
     } 
    } 
    if(count($emails) > 0){ 
     return $emails; 
    } 
    else{ 
     return null; 
    } 
} 

$string = "Guys, please help me to extract valid [email protected] email addresses from some text content using php 
example , i have below text content in mysql database ' Life is more beautiful, and i like to explore lot please email me to [email protected] Learn new things every day. 'from the above text content i want to extract email address '[email protected]' using php regular expressions or other method."; 

$matches = extract_email_addresses($string); 
print_r($matches); 

?> 
Problemi correlati