Подтвердить что ты не робот

В 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

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

4b9b3361

Ответ 2

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

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

// don't need to preassign $matches, it 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]',
)

Ответ 3

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

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

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

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

Ответ 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].

Ответ 5

Это регулярное выражение будет извлекать весь уникальный адрес электронной почты из 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

Ответ 6

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

<?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/

Ответ 7

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

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

?>

Ответ 8

Извлечение писем из текстов, которые пользователи свободно вводят в свои описания, иногда может быть кошмаром для разработчиков. то есть. Как извлечь письма из текста, как это?

"Моя электронная почта... [email protected] мне лень расставлять пробелы перед электронными письмами, поэтому у меня есть другая электронная почта... [email protected]___ Я знаю, что это может создать проблему для разработчиков. :) "

Это немного гибко, но недостаточно для вставленного текста, который какой-то пользователь ввел в мою базу данных:

preg_match_all ("/[a-z0-9] [._ + a-z0-9 -] + @[._ a-z0-9 -]+. [az] +/i", $ текст, $ совпадений);

(Конечно, проверка FILTER_VALIDATE_EMAIL в коде php ОБЯЗАНА.)

Хорошее место для тестирования здесь: https://www.functions-online.com/preg_match_all.html