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

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

$string = file_get_contents("example.txt"); // Load text file contents $matches = array(); //create array $pattern = '/[A-Za-z0-9_-]+@[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 

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

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

Вы довольно близки, но регулярное выражение не будет захватывать все форматы электронной почты, и вам не нужно указывать 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 a+b@google.com.sg, and the i makes it case insensitive $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([az]{2,3})(?:\.[az]{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 => 'test1+2@gmail.com', 1 => 'test-2@yahoo.co.jp', 2 => 'test@test.com', 3 => 'test@test.co.uk', 4 => 'test@google.com.sg', ) 

Я знаю, что это не вопрос, который вы задали, но я заметил, что ваше регулярное выражение не принимает никаких адресов, таких как « myemail@office21.company.com » или любой адрес с субдоменом. Вы могли бы заменить его чем-то вроде:

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

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

Я также предлагаю вам прочитать эту статью по проверке электронной почты , она довольно хорошая и информативная.

Это определяет все почтовые адреса:

 $sourceeee= 'Here are examplr mymail@yahoo.com and my-e.mail@goog.com or something more'; preg_match_all('/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/i', $sourceeee, $found_mails); 

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

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

 <? $url="http://example.com/"; $text=file_get_contents($url); $res = preg_match_all( "/[a-z0-9]+[_a-z0-9\.-]*[a-z0-9]+@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{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

Мне было лучше:

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

Некоторые из других не принимали такие домены, как: name@example.com.sv

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

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

 <?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 sam-ple.1990@gmail.co.uk 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 sample@gmail.com. Learn new things every day. 'from the above text content i want to extract email address 'sample-x@gmail.com' using php regular expressions or other method."; $matches = extract_email_addresses( $string ); print_r($matches); ?>