Metin Kütle, kiraz e-posta adreslerini almak

7 Cevap php

Ben metin dolu ve büyük bir dosya var, bazı e-posta adresleri vardır.

Düzenli ifade fonksiyonu bulabiliriz e-posta adresleri bir dizi dönmek php hangisi?

Şimdiye kadar var

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

ama bu sonucu verir

7 Cevap

Mükemmel çalışır Final kodu, teşekkürler herkese :)

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

Sözetmek, regex için google temizleme sonra benim script ile, burada toplanan desenleri:

    $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|>)";

En iyi desen:

$pattern = "/([\s]*)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*([ ]+|)@([ ]+|)([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,}))([\s]*)/i";

Ben üç sorun bakın:

  1. Düzenli ifadelerde, ^ bir çizgi (veya dize) bir başlangıç ​​demektir ve $ bir çizgi (veya dize) ucunu anlamına desen o değil kullanarak neden, bu muhtemelen 't çalışır. Bu tek başına bir satırda bir e-posta adresi bulur.

  2. Sen preg_match için dosyanın adını geçiyoruz; bir dize aranacak bekliyor. Bunu işlevine dosyanın metin geçmek için gibi file_get_contents aramak falan gerekiyor.

  3. Birden adreslerinin her dosyada varsa, preg_match_all, bir defada birden fazla eşleşme bulmak için kullanmanız gerekir.

Böyle bir şey deneyin:

$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.
}

Regex basitleştirilmiş değil,% 100 RFC822 uygulamasıdır.

EDIT:

readdir işlevi başarı değil dosya içerikleri üzerinde filename döndürür. Sen yapmayı deneyebilirsiniz:

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 />";
   }
}

Baştan sona okuyun

Eğer bu amaç için web'de bulabileceğiniz orada verilen Regex veya başka Regex uyum ve daha sonra basitçe yapabilirsiniz

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

$matches sonra kullanılan Regex bulundu ne içerecektir.

Durumda dosya belleğe yüklenecek çok büyük, fgets() ile üzerinde yineleme düşünün.

E-posta adresleri için regexes bahsediyoruz sitelerinin bir numarası vardır. This one, özellikle oldukça geniş.

Kısa cevap, bir 'geçerli' e-posta adresi tanımı basit bir regex elverişli olmamasıdır. E-posta adresleri için en pratik, düzenli ifadeler sadelik bütünlüğü ticaret.

Bunu dene:

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

Başlangıç ​​ve bitiş gruplara diğer olası ayraçları ekle ^|\s|<