Как в 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 answers
Ваш код почти идеален, вам просто нужно заменить 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 [email protected], 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 => '[email protected]',
1 => '[email protected]',
2 => '[email protected]',
3 => '[email protected]',
4 => '[email protected]',
)
Я знаю, что это не тот вопрос, который вы задавали, но я заметил, что ваше регулярное выражение не принимает никаких адресов, таких как "[email protected]
", или любых адресов с поддоменом. Вы могли бы заменить его чем-то вроде:
/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/
, Который отклонит менее действительное электронное письмо (хотя оно и не идеально).
Я также предлагаю вам прочитать эту статью о проверке электронной почты , она довольно хорошая и информативная.
Это определяет все адреса электронной почты:
$sourceeee= 'Here are examplr [email protected] and [email protected] 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 [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/
Эта функция прекрасно работает без использования регулярного выражения. Так что это действительно быстрее и с низким ресурсоемкостью.
<?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);
?>