Масса текста, вишня подбирать адреса электронной почты - PullRequest
1 голос
/ 25 февраля 2010

У меня большой текстовый файл, и есть несколько адресов электронной почты.

Какая функция регулярного выражения php возвращает массив адресов электронной почты, которые она может найти?

Пока у меня есть

<?php

$pattern = "/^[^@]*@[^@]*\.[^@]*$/";

if ($handle = opendir('files')) {

/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
   preg_match($pattern, $file, $matches);

   echo count($matches);
   foreach ($matches as $email) {
     echo "$email <br />";
   }
}

closedir($handle);
}

но это не дает результатов

Ответы [ 7 ]

3 голосов
/ 25 февраля 2010

Стоит отметить, что после поиска в Google для регулярных выражений, с моим сценарием, вот образцы, которые я собрал:

    $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$";
$pattern = "/([\s]*)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*([ ]+|)@([ ]+|)([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,}))([\s]*)/i";
$pattern = '#([^@]+@[-a-z0-9.]+)#';
$pattern = '(^|\s|<)[a-zA-Z]([.+-]?\w+)+@(\w{2,}\.)+\w{2,5}($|\s|>)';
$pattern = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$";
$pattern = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
$pattern = "(^|\s|<)[a-zA-Z]([.+-]?\w+)+@(\w{2,}\.)+\w{2,5}($|\s|>)";

Лучший шаблон:

$pattern = "/([\s]*)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*([ ]+|)@([ ]+|)([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,}))([\s]*)/i";
1 голос
/ 25 февраля 2010

Я вижу три проблемы:

  1. В регулярных выражениях ^ означает начало строки (или строки), а $ означает конец строки (или строки), поэтому, вероятно, используемый вами шаблон не Работа. Он может найти адрес электронной почты только в строке.

  2. Вы передаете имя файла preg_match; он ожидает строку для поиска. Вам нужно вызвать file_get_contents или что-то подобное, чтобы передать текст файла в функцию.

  3. Вам нужно использовать preg_match_all, чтобы найти более одного совпадения за раз, если в каждом файле несколько адресов.

1 голос
/ 25 февраля 2010

Попробуйте что-то вроде:

$file = file_get_contents('filename.txt');
if(preg_match_all('#([^@]+@[-a-z0-9.]+)#',$file,$matches)) {
  $emails = $matches[1]; // array of all the emails in the file.
}

Регулярное выражение упрощено, а не на 100% реализации RFC822.

EDIT:

Функция readdir возвращает имя файла в случае успеха, а не содержимое файла. Вы можете попробовать сделать:

while (false !== ($file = readdir($handle))) {
   $file_contents = file_get_contents($file);
   if(preg_match_all('#([^@]+@[-a-z0-9.]+)#', $file_content, $matches)) {

     echo count($matches[1]);
     foreach ($matches[1] as $email) {
       echo "$email <br />";
   }
}
0 голосов
/ 25 февраля 2010

Попробуйте это:

(^|\s|<)[a-zA-Z]([.+-]?\w+)+@(\w{2,}\.)+\w{2,5}($|\s|>)

Добавление других возможных разделителей в начальную и конечную группы ^|\s|<

0 голосов
/ 25 февраля 2010

Финальный код, который отлично работает, спасибо всем:)

<?php

set_time_limit('0');
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$";

if ($handle = opendir('files')) {
    while (false !== ($file = readdir($handle))) {
        $content = file_get_contents('files/'.$file);
        preg_match_all('#([^@]+@[-a-z0-9.]+)#', $content, $matches);
        echo count($matches[1]).' - '.$file.'<br />';
    }
    closedir($handle);
}
0 голосов
/ 25 февраля 2010

Есть несколько сайтов, которые говорят о регулярных выражениях для адресов электронной почты. Этот , в частности, довольно обширный.

Короткий ответ: определение «действительного» адреса электронной почты не поддается простому регулярному выражению. Наиболее практичные регулярные выражения для адресов электронной почты обмениваются полнотой на простоту.

0 голосов
/ 25 февраля 2010

Прочитать

Вы можете адаптировать Regex, данное там, или любое другое Regex, которое вы можете найти в Интернете для этой цели, а затем просто сделать

preg_match_all($pattern, $someString, $matches);

$matches будет содержать все, что было найдено для используемого вами регулярного выражения.

Если ваш файл слишком велик для загрузки в память, рассмотрите возможность его перебора с помощью fgets () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...