Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wydobyciem maili
Forum PHP.pl > Forum > Przedszkole
knefelio
Mma problem z wydobyciem maili z pliku txt. Cos takiego udało mi się stworzyć , ale niestety prócz maili zwraca jeszcze niepotrzebne znaki:

  1. $plik = 'maile.txt';
  2.  
  3. if(isset($_POST['userInput']))
  4. {
  5. file_put_contents($plik, $_POST['userInput']);
  6. }
  7.  
  8. print '<form method="POST"><textarea name="userInput" cols="20" rows="20" wrap="virtual">'.file_get_contents($plik).'</textarea><input type="submit"/></form>';
  9.  
  10. $wskaz = fopen("maile.txt", "r");
  11.  
  12. while($wiersz = @fgets($wskaz, 1024))
  13. {
  14. $file_contents = file_get_contents($plik);
  15. if(preg_match_all('#([^@]+@[-a-z0-9.]+)#', $file_contents, $matches)) {
  16. foreach ($matches[1] as $email) {
  17. echo "$email <br />";
  18. }
  19. }
  20. }


nikt nie wie?
mortus
Kolego musisz się zdecydować, w jaki sposób chcesz odczytać te adresy e-mail. Albo odczytujesz je w pętli czytając plik linia po linii, albo korzystasz z wyrażeń regularnych. Ty robisz obie rzeczy na raz, co w ogóle nie ma sensu. Jak te adresy są zapisywane? Jeśli każdy adres e-mail ma być w osobnej linijce, to brakuje Ci znacznika nowej linii w file_put_contents():
  1. file_put_contents($plik, trim($_POST['userInput']) . PHP_EOL);

Wtedy można posłużyć się funkcją file() z odpowiednim drugim parametrem (FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES). A do tego wystarczy prosta pętla foreach.

Funkcje file_get_contents() i file() zadziałają dla pliku maile.txt, którego rozmiar nie przekracza dajmy na to 50MB (czyli dla odpowiednio małego pliku). W przypadku większych plików trzeba czytać plik linia po linii.
knefelio
ok, usunąłem pętle, sam plik jest zawsze znacznie mniejszy niż 50mb. Natomiast, wyświtla mi również stringi nie będące mailem, więc nie wiem czy te regularne dopasowanie jest prawidłowe:

  1. $file_contents = file_get_contents($plik, FILE_SKIP_EMPTY_LINES);
  2. if(preg_match_all('#([^@]+@[-a-z0-9.]+)#', $file_contents, $matches)) {
  3. foreach ($matches[1] as $email) {
  4. echo "$email <br />";
mortus
Czytaj proszę ze zrozumieniem. file_get_contents nie ma drugiego argumentu w postaci stałej FILE_SKIP_EMPTY_LINES. Ciężko powiedzieć, czy wzorzec jest prawidłowy nie mając odpowiedniego fragmentu teksu zawierającego adresy e-mail. Wklej tutaj fragment pliku maile.txt.

EDIT: Jednak nie tak ciężko. Wzorzec nie służy do wyszukiwania adresu e-mail, ale do pobrania ciągu zawierającego znak @ i następujące po nim znaki pauzy, kropki oraz małe litery i cyfry. W sieci jest mnóstwo przykładów Google -> PCRE email address na to, jak sprawdzić adres e-mail. Poza tym preg_match_all zwraca nieco inną tablicę, w związku z czym pętla foreach musi wyglądać inaczej.
crocodillo
  1. $file_contents = file_get_contents($plik);
  2. if(preg_match_all('/[0-9a-z\._\-+]+@[a-z0-9]+\.[a-z0-9\.]*[a-z0-9]+/i', $file_contents, $matches)) {
  3.  
  4. // ...
  5.  
  6. }


Tylko to jest wersja BARDZO uproszczona, nie rozpoznaje wszystkich emaili. Jeśli chcesz zrobić to porządnie zapoznaj się z budową adresu email: http://en.wikipedia.org/wiki/Email_address
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.