Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] preg_match
Forum PHP.pl > Forum > PHP
Karioka
Witam,

Zdarzają mi się problemy z serwerem poczty i ostatnio mam sporo zwrotek. Aby nie wyciągać z treści emaili adresów ręcznie chcę to robić skryptem PHP. Nie radzę sobie jednak z odpowiednim napisaniem wyrażenia w preg_match.

Koncepcja jest taka: skrypt łączy się ze skrzynką, pobiera wiadomości w pętli i z body wiadomości wycina email, z którego przyszła zwrotka. Jako wynik operacji wyświetla wycięte adresy z emaili w skrzynce. Na koniec kasuje email.

Łączenie do skrzynki działa, treść jest pobierana, kasowanie działa. Nie potrafię jednak wyciąć adresu z treści.

Schemat treści, w jakiej jest email wygląda tak:

  1. for <a href="[email="adresemail@wp.pl"]mailto:adresemail@wp.pl[/email]" onclick="return rcmail.command('compose'


Mój skrypt obecnie wygląda tak (preg_match testowałam już w różnej postaci):

  1. <?
  2. IF($mbox = imap_open("{mail.poczta.serwer.com:110/pop3/notls}INBOX", 'login', 'password'))
  3. {
  4. echo "Połączenie nawiązane<br>";
  5. $emailcou=imap_num_msg($mbox);
  6. if ($emailcou>0)
  7. {
  8. echo '<br />Wiadomości: '.(int)$emailcou; flush();
  9. echo '<br><br>';
  10. for($i = 1; $i <= $emailcou; $i++)
  11. {
  12. $wiadomosc=imap_body($mbox, $i);
  13.  
  14. preg_match('#for <a href=\"mailto:adresemail@wp.pl\" onclick=\"return rcmail.command#is', $wiadomosc, $mail);
  15.  
  16. $mail = $mail[1];
  17. echo $mail."<br>"; // Wyświetla email
  18.  
  19. imap_delete($mbox, $i); // Kasuje wiadomosc
  20. flush();
  21. }
  22. }
  23. imap_expunge($mbox);
  24. imap_close($mbox);
  25. }
  26. ?>


Będę ogromnie wdzięczna za sugestie.


Thorang Hoog
Spróbuj:
  1. $match =
  2. '%'.
  3. 'for\s+<a\s+href'. // for (przerwa) <a (przerwa) href
  4. '\s*=\s*'. // (przerwa) = (przerwa)
  5. '\"mailto:'. // początek stanowiący o mailu
  6. '('. // zapamiętaj podwzorzec
  7. '[_a-z0-9\-]+'. // pierwszy człon emaila
  8. '(?:'. // podwzorzec nie zapamiętany
  9. '\.[_a-z0-9\-]+'. // znaki dostępne w adresie przed @ zaczynając od kropki
  10. ')*'. // zero lub więcej razy
  11. '@'.
  12. '[a-z0-9\-]+'. // pierwszy człon domeny jeden lub więcej znaków
  13. '(?:\.[a-z0-9\-]+)*'. // możliwe kolejne człony domeny
  14. '(?:\.[a-z]{2,3})'. // koniec adresu 2 do 3 znaków
  15. ')'. // koniec podwzorca
  16. '\"\s+onclick\s*=\s*\"return\s+rcmail\.command'. // onclick (przerwa) = (przerwa) "return rcmail.command
  17. '%is'; // >> $match
  18. preg_match($match, $wiadomosc, $mail);
Karioka
Skrypt w tej postaci:

  1. <?
  2.  
  3.  
  4. IF($mbox = imap_open("{mail.poczta.serwer.com/pop3/notls}INBOX", 'login', 'pass'))
  5. {
  6. echo "Połączenie nawiązane<br>";
  7. $emailcou=imap_num_msg($mbox);
  8. if ($emailcou>0)
  9. {
  10.  
  11. echo '<br />Wiadomości: '.(int)$emailcou; flush();
  12. echo '<br><br>';
  13. for($i = 1; $i <= $emailcou; $i++)
  14.  
  15. {
  16.  
  17. $wiadomosc=imap_body($mbox, $i);
  18.  
  19. // preg_match('#mailto:"(.*?)"#is', $wiadomosc, $mail);
  20.  
  21. $match =
  22. '%'.
  23. 'for\s+<a\s+href'.
  24. '\s*=\s*'.
  25. '\"[email=""]mailto:'[/email].
  26. '('.
  27. '[_a-z0-9\-]+'.
  28. '(?:'.
  29. '\.[_a-z0-9\-]+'.
  30. ')*'.
  31. [email=""]'@'[/email].
  32. '[a-z0-9\-]+'.
  33. '(?:\.[a-z0-9\-]+)*'.
  34. '(?:\.[a-z]{2,3})'.
  35. ')'.
  36. '\"\s+onclick\s*=\s*\"return\s+rcmail\.command'.
  37. '%is';
  38. preg_match($match, $wiadomosc, $mail);
  39.  
  40. $mail = $mail[1];
  41.  
  42. echo $mail;
  43.  
  44. // imap_delete($mbox, $i); // Kasuje wiadomosc
  45. flush(); }
  46. }
  47. imap_expunge($mbox);
  48. imap_close($mbox);
  49. }
  50. ?>


Nie zwraca wyników, ani błędów.

Jakaś podpowiedź? sciana.gif


Thorang Hoog
U mnie skrypt:
  1. <?PHP
  2.  
  3.  
  4. /*IF($mbox = imap_open("{mail.poczta.serwer.com/pop3/notls}INBOX", 'login', 'pass'))
  5.  {
  6. echo "Połączenie nawiązane<br>";
  7. $emailcou=imap_num_msg($mbox);
  8. if ($emailcou>0)
  9. {
  10.  
  11. echo '<br />Wiadomości: '.(int)$emailcou; flush();
  12. echo '<br><br>';
  13. for($i = 1; $i <= $emailcou; $i++)
  14.  
  15. {
  16.  
  17. $wiadomosc=imap_body($mbox, $i);
  18. */
  19. // preg_match('#mailto:"(.*?)"#is', $wiadomosc, $mail);
  20. $wiadomosc = "for <a href=\"mailto:adresemail@wp.pl\" onclick=\"return rcmail.command('compose'";
  21. $match =
  22. '%'.
  23. 'for\s+<a\s+href'.
  24. '\s*=\s*'.
  25. '\"mailto:'.
  26. '('.
  27. '[_a-z0-9\-]+'.
  28. '(?:'.
  29. '\.[_a-z0-9\-]+'.
  30. ')*'.
  31. '@'.
  32. '[a-z0-9\-]+'.
  33. '(?:\.[a-z0-9\-]+)*'.
  34. '(?:\.[a-z]{2,3})'.
  35. ')'.
  36. '\"\s+onclick\s*=\s*\"return\s+rcmail\.command'.
  37. '%is';
  38. preg_match($match, $wiadomosc, $mail);
  39.  
  40. print_r($mail);
  41. $mail = $mail[1];
  42.  
  43. echo $mail;
  44. /*
  45. // imap_delete($mbox, $i); // Kasuje wiadomosc
  46. flush(); }
  47. }
  48. imap_expunge($mbox);
  49. imap_close($mbox);
  50. }*/
  51. ?>

dał wynik:
Kod
Array
(
    [0] => for <a href="[email="adresemail@wp.pl"]mailto:adresemail@wp.pl[/email]" onclick="return rcmail.command
    [1] => adresemail@wp.pl
)
adresemail@wp.pl


dry.gif
Czy u ciebie w pliku php jest zapisane
linia 25 twojego przykładu: '\"[email=""]mailto:'[/email].
linia 31 twojego przykładu: [email=""]'@'[/email].

Jeśli tak to usuń [email=""] oraz [/email]
chyba że to błąd forum tongue.gif to zamieść przykładową treść maila (To zobaczę czy aby na pewno dobre podstawienie napisałem) albo spróbuj
  1. $match = '%mailto:([_a-z0-9\-]+(?:\.[_a-z0-9\-]+)*@[a-z0-9\-]+(?:\.[a-z0-9\-]+)*(?:\.[a-z]{2,3}))%is';


znajdzie pierwszy adres maila w tekście.
Karioka
// EDIT

Tutaj był długi post ale niestety podczas edycji dodały się zbędne znaczniki HTML i wszystko się rozjechało.

Jakby wyglądała reguła, gdybyśmy szukali adresu w takim schemacie:

To: adres@email.pl

?

W pierwszym przypadku, który podałam popełniłam błąd. Webmail dodał w treści swoje własne znaczniki, w tym kod JS. W zwrotce tego nie ma.

// Edit 2

Zmieniłam Twoją regułę na

  1. $match = '%To: ([_a-z0-9\-]+(?:\.[_a-z0-9\-]+)*@[a-z0-9\-]+(?:\.[a-z0-9\-]+)*(?:\.[a-z]{2,3}))%is';


I wszystko gra. Dzięki wielkie za pomoc!
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.