2010-10-10 2 views
24

У меня есть блок текста, из которого я хочу извлечь действительные адреса электронной почты и поместить их в массив. До сих пор у меня есть ...В PHP, как извлечь несколько адресов электронной почты из блока текста и поместить их в массив?

$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 

Однако, я получаю массив только с одним адресом. Поэтому я предполагаю, что мне нужно каким-то образом пройти через этот процесс. Как мне это сделать?

ответ

11

Ваш код почти идеально, вам просто нужно заменить preg_match(...) с 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

Большое спасибо! Сейчас я приближаюсь. Однако мой результат выглядит немного странным для меня. Кажется, я получаю массивы в моем массиве следующим образом: Array ([0] => Array ([0] => example @ slu.edu) [1] => Array ([0] => edu)) – HumbleHelper

+0

Я ищу только один массив с каждым ключом, содержащим адрес электронной почты. – HumbleHelper

+1

@HumbleHelper preg_replace_all создаст новые элементы массива для подматричек всего, что было в круглых скобках в исходном шаблоне. В круглых скобках вокруг последней части находится домен в вашем шаблоне. Чтобы исправить это, вы можете просто добавить $ matches = $ matches [0] в конце. Посмотрите также на ответ Клэй Хинсон. Он заслуживает принятого ответа. – stevendesu

18

Я знаю, что это не вопрос, который вы просили, но я заметил, что ваше регулярное выражение не принимает любой адрес, например «[email protected]» или любой адрес с субдоменом. Вы можете заменить его на что-то вроде:

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

, который отклонит менее действительное электронное письмо (хотя оно не идеально).

Я также предлагаю вам прочитать this article on e-mail validation, это довольно хорошо и информативно.

+1

Благодарим вас за ваше предложение! Я использовал ответ @Clay Hinson, но это не с субдоменами. Я объединил 2 ответа, и я понял: «/[a-z0-9_.\-\+]{1,256}[email protected][a-z0-9\-\.]+\.([az]{2, 4})/i «Я использовал strtolower() по электронной почте var, поэтому он не требует AZ – jaysponsored

+0

Вы потрясающий! –

+0

Это регулярное выражение работает, один из ответов @Clay Hinson не – Crasher

28

Вы довольно близки, но регулярное выражение не будет захватывать все форматы электронной почты, и вам не нужно указывать A-Za-z, вы можете просто использовать флаг «i», чтобы отметить все выражение как без учета регистра. Есть случаи, когда пропущены письма (особенно субдомены), но это улавливает те, которые я тестировал.

$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]); 

выход:

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

+1 для более подробной информации, чем мой ответ, пример кода и шаблон, который ловит субдомены. Это должен быть принятый ответ. – stevendesu

+0

Да, это хорошо работает ... – VKGS

+3

Это решение является ошибкой, если вы не исправите его. Вышеупомянутое регулярное выражение разбивает электронные письма типа [email protected], в которых последняя часть состоит из 4 + символов. Вы regex возвращает '[email protected]'. Пожалуйста исправьте. – Eye

1

Это регулярное выражение будет извлекать все уникальный адрес электронной почты из URL или файла и вывода каждого в новой строке. Он рассмотрит все субодомены и префиксы суффикса. Найдите удобство в использовании.

<? 
$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."; 
} 
?> 

чек здесь для получения дополнительной справки: http://www.php.net/manual/en/function.preg-match-all.php

4

Это определяет все адреса электронной почты:

$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); 

, то вы можете использовать $found_mails[0] массив.

0

Он работал лучше для меня:

<?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]; 
?> 

Некоторые другие не принимали такие домены, как: [email protected]

Я нашел его на: http://snipplr.com/view/63938/

0

Этот функция работает отлично, не используя регулярное выражение. Таким образом, это действительно быстрый и низкий ресурс.

<?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); 

?> 
Смежные вопросы