В 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
Тем не менее, я получаю массив только с одним адресом. Поэтому я предполагаю, что мне нужно каким-то образом пройти этот процесс. Как я могу это сделать?
7 ответов
Ваш код почти идеален, вам просто нужно заменить preg_match(...)
с preg_match_all(...)
Вы довольно близки, но регулярное выражение не будет перехватывать все форматы электронной почты, и вам не нужно указывать 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\-]+\.([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 => '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-]+)*(\.[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
Это сработало лучше для меня:
<?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-]+)*(\.[a-z]{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);
?>