Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyszukanie wyrażenia regularnego i zapis do pliku
Forum PHP.pl > Forum > Przedszkole
tchoman
Witam serdecznie.
Mam prosty skrypt, który ma wyszukać w podanym pliku(stronie) wyrażenie(w tym wypadku wzorzec adresu mail) i zapisanie ich do nowo utworzonego pliku. Zrobiłem pętlę w której ma przeszukiwać plik linia po linii, no i nie ma efektu. Kombinowałem na różne sposoby. Gdzie robię błąd?

CODE

function zdobadz_email($strona)
{
$sprawdz = '/^[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/';
//$sprawdz = '/^(aaa)$/';

$plik = fopen($strona,'r');

$moj_plik = fopen('tymczasowy_index.txt','a');
flock($moj_plik, 2);


while(!feof($plik))
{
$linia = fgets($plik);

if ( preg_match_all($sprawdz, $linia, $wynik))
{

file_get_contents($moj_plik, $wynik);
fputs ($moj_plik, $wynik);
}
}
fclose($plik);


rewind($moj_plik);


$adresy = file('tymczasowy_index.txt');


$adres = "tchoman@poczta.onet.pl";
$tytul = "Adresy e-mail";
$wiadomosc = ("Znalezione adresy e-mail to: $adres");
mail($adres, $tytul, $wiadomosc);


flock($moj_plik, 3);


fclose($moj_plik);


//unlink($moj_plik);
}

?>
jacobson
A ta zmienna strona to jest adres strony ?
Sprobuj moze za pomoca cUrl pobierac zawartosc strony i dopiro wtedy sprawdzaj tego maila.
tchoman
Najpierw dla uproszczenia $strona to zwykły plik .txt który stworzyłem ręcznie w tym samy katalogu i wpisałem kilka linijek tekstu, które odpowiadają wzorcowi (aby było co przeszukiwać).

CODE

<?php

require("szukaczmaila.php");

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Szukacz adresów mail</title>
</head>

<body>
<?php

zdobadz_email("testowy.txt");

?>
<p>Wiadomość została wysłana</p>
</body>
</html>

Wszystko na localhost
jacobson
Sprawdz czy na pewno wchodzi Ci do warunku if z preg_matchem. Dodatkowo jedna wazna rzecz. preg_match_all zwraca tablice tak wiec jezeli juz znajdzie maila to powinienes wertowac w jakims foreachu np

  1. foreach($wynik[0] as $match){
  2. file_get_contents($moj_plik, $match);
  3. }


nie sprawdzalem wyrazenia regularnego czy na pewno dziala. Najwazniejsze to sprawdz czy na pewno znajduje Ci maila na stronie.
viking
Inna sprawa że to nie jest poprawny regexp dla maila.
tchoman
Wzorzec wyrażenia jest prawidłowy bo na innym skrypcie działa. Zreszą próbowałem na prostym ciągu (aaa)
_all do preg_match to już moja kolejna wariacja wcześniej testowałem sam preg_match.
Po prostu skrypt tworzy nowy plik (w tym przypadku 'tymczasowy_index.txt' ) ale nie zapisuje się do niego nic (jest pusty).
Jedyny komunikat o błędzie to :
Warning: mail(): Failed to connect to mailserver at &quot;localhost&quot; port 25, verify your &quot;SMTP&quot; and &quot;smtp_port&quot; setting in php.ini or use ini_set() in C:\wamp\www\WyszukiwanieAdresowMail\szukaczmaila.php on line 46
ale to jeśli chodzi o wysłanie i nie powinno mieć znaczenia, bo jeśli wstawię tę część kodu odpowiedzialną za wysyłanie do komentarza to nic nie zmienia
jacobson
a czy sprawdziles czy na pewno wchodzi do tego if-a ? wstaw sobie jakas zmienna testowa, sprawdz czy tam wchodzi. Zdebuguj, cokolwiek - bedzie znacznie latwiej
tchoman
Witam ponownie.
Po zabawach ze skryptem z pierwszego postu, wykombinowałem takie coś, potraktowałem to funkcją "serialize" i działa tak jak powinno.
Szuka zadanego 'regexp' i wpisuje do pliku tak jak trzeba:
Tak wygląda teraz kod:
CODE

function zdobadz_email()

{

$sprawdz = '/[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}/';
$plik = fopen('testowy.txt','r');
$moj_plik = fopen('maile.txt','w+');

flock($moj_plik, 2);



$plik = file('testowy.txt') or die('Wystąpił błąd.');
echo '<ul>';
foreach($plik as $linia)
{
if(preg_match_all($sprawdz, $linia, $wynik));
$wynik = serialize($wynik);
fputs($moj_plik, $wynik);
echo '<li>'.$linia.'</li>';
}
echo '</ul>';

flock($moj_plik, 3);
fclose($moj_plik);
//unlink($moj_plik);
}
zdobadz_email();

zamiast 'foreach' to samo uzyskałem za pomocą 'while' tu fragment kodu:
CODE

while(!feof($plik))
{
$linia = fgets($plik);
preg_match_all($sprawdz, $linia, $wynik);
$wynik = serialize($wynik);
fputs($moj_plik, $wynik);
}

Teraz mam inne pytanie, funkcja 'serialize' wpisuje mi do pliku znalezione 'regexp' w formie tablicy, wygląda to tak:

a:1:{i:0;a:1:{i:0;s:22:"tchoman@poczta.onet.pl";}}a:1:{i:0;a:1:{i:0;s:10:"dd@dcc.com";}}a:1:{i:0;a:1:{i:0;s:16:"kxkxkx@lxlxlx.pl";}}

a ja bym chciał żeby skrypt wpisał to do pliku .txt w postaci stringa

-tchoman@poczta.onet.pl
-dd@dcc.com"
-kxkxkx@lxlxlx.pl

jak przerobić kod?


Witam ponownie
Z powyższym już też sobie poradziłem, a mianowicie tak:
CODE

if(preg_match($sprawdz, $linia, $wynik));
{
//$wynik = serialize($wynik);
$wynik = implode(",", $wynik); //z 'preg_match' wywaliłem 'all' i wtedy za 'serialize' da się wykorzystać 'implode'
fputs($moj_plik, $wynik); // i wtedy ładnie zapisuje do .txt string
}
echo '<li>'.$linia.'</li>';

Ale pojawia się mały problem, 'include' jako 1 paramert może dostać separator, ja bym chciał żeby każdego 'regexp' wpisało do nowego wiersza, ale w tym przypadku nawet zwykły
"-" nie działa, niezależnie jaki separator próbuję wpisać dalej wyświetla wszystko w ciągu bez separacji.
Jak prawidłowo to zrobić ?

Edit: I z tym sobie poradziłem, trzeba tak to wpisać

$wynik = implode($wynik)."\r\n";

Ale swoją drogą wie ktoś dlaczego separator w 'implode' nie zadziałał?
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.