PDA

Bekijk Volledige Versie : emailadressen uit een file plukken



Matthijs de Z
11/03/05, 15:25
Hallo,

Ik heb een scriptje gemaakt dat emailadressen uit een fouten.dxb file haalt.
Ik wil nu namelijk maar eens af van alle foutmeldingen van niet meer
bestaande emailadressen uit mijn mailinglijst. Ik krijg daar steeds een
foutmelding van en die komen in een map fouten, vandaar dat ik die wil
uitlezen.

onderstaandscript werkt...deels

<?php

$fd = fopen("fouten.dxb","r");
while (!feof($fd)):

$regel = fgets($fd, 4096);

$opsplitsen=explode(" ",$regel);
$regel="";

for($i=0;$i<sizeof($opsplitsen);$i++)
{
if(eregi("^.[a-zA-Z0-9_.\.-]+@[a-z0-9_]+\\.[a-z]+",$opsplitsen[$i]))
{
$opschonen = ereg_replace('<','',$opsplitsen[$i]);
$opschonen = ereg_replace('>','',$opschonen);
$opschonen = ereg_replace(';','',$opschonen);
$opschonen = ereg_replace('\(','',$opschonen);
$opschonen = ereg_replace('\)','',$opschonen);

//klaarmaken om het domein te herkennen
$domein1 = explode("@",$opschonen);
$domein2 = explode(".",$domein1[1]);

//als het emailadres van mijn site cq de hosting server is....niets doen
if($domein2[0]!="beursanalyse" && $domein2[0]!='starfish' &&
$domein2[0]!='gold')
{
//even explode op & omdat er soms adressen in een link staan met een ID
nummer er achter.
$email = explode("&",$opschonen);
$output = strtolower($email[0]);
$vullen[]=$output;
//echo"\n<br>".$output;
}
}
}

endwhile;

sort($vullen);
$telvullen = count($vullen);
for($j=0;$j<$telvullen;$j++)
{
//print een emailadres maar 1 keer uit door te controleren of de voorgaande
en volgende array hetzelfde is
if($vullen[$j-1]!=$vullen[$j] && $vullen[$j]!=$vullen[$j+1])
{
echo"\n<br>".$vullen[$j];
}
}

//gooi de file weer dicht
close(fd);

?>

Ik heb alleen gemerkt dat niet alle adressen er uit worden gevist. Zo wordt
iets met bijvoorbeeld <a href="mailto:jemoer@hierduseenemail.info"> niet
opgemerkt. Op zich logisch, want ik laat de boel ploffen op " ".

Verder krijg ik soms achter een emailadres drie puntjes "..." of een ":"
(direct aan het adres) of dit soort troep: h? of .°r of n`» en ga zo
maar door.

Heeft iemand een idee hoe ik een beter opdracht kan geven tot het vinden van
emailadressen en deze dan ook correct uit de file kan halen?
Groeten,

Matthijs

Matthijs de Z
11/03/05, 16:45
Bas stuurde me een email waar hij het volgende script in beschreef:

<?php
set_time_limit(300);
$msg = file_get_contents("lijst2.txt");
preg_match_all("(([a-zA-Z0-9_]|\\-|\\.)+@(([a-zA-Z0-9_]|\\-)+\\.)+[a-zA-Z]{2
,4})",$msg,$emails);
$emailArray =array_unique($emails[0]);
$telvullen = count($emailArray);
for($j=0;$j<$telvullen;$j++)
{
echo"\n<br>".$emailArray[$j];
}

?>

Een stuk korter en het werkt prima. Ook die vreemde tekens zijn weg.
Groeten,

Matthijs

"Matthijs de Z"
<haalallesvoorhetstreepjesplushetstreepjezelfweg-mldz@hotmail.com> wrote in
message news:d0s99q$26km$1@nl-news.euro.net...
> Hallo,
>
> Ik heb een scriptje gemaakt dat emailadressen uit een fouten.dxb file
haalt.
> Ik wil nu namelijk maar eens af van alle foutmeldingen van niet meer
> bestaande emailadressen uit mijn mailinglijst. Ik krijg daar steeds een
> foutmelding van en die komen in een map fouten, vandaar dat ik die wil
> uitlezen.
>
> onderstaandscript werkt...deels
>
> <?php
>
> $fd = fopen("fouten.dxb","r");
> while (!feof($fd)):
>
> $regel = fgets($fd, 4096);
>
> $opsplitsen=explode(" ",$regel);
> $regel="";
>
> for($i=0;$i<sizeof($opsplitsen);$i++)
> {
> if(eregi("^.[a-zA-Z0-9_.\.-]+@[a-z0-9_]+\\.[a-z]+",$opsplitsen[$i]))
> {
> $opschonen = ereg_replace('<','',$opsplitsen[$i]);
> $opschonen = ereg_replace('>','',$opschonen);
> $opschonen = ereg_replace(';','',$opschonen);
> $opschonen = ereg_replace('\(','',$opschonen);
> $opschonen = ereg_replace('\)','',$opschonen);
>
> //klaarmaken om het domein te herkennen
> $domein1 = explode("@",$opschonen);
> $domein2 = explode(".",$domein1[1]);
>
> //als het emailadres van mijn site cq de hosting server is....niets doen
> if($domein2[0]!="beursanalyse" && $domein2[0]!='starfish' &&
> $domein2[0]!='gold')
> {
> //even explode op & omdat er soms adressen in een link staan met een
ID
> nummer er achter.
> $email = explode("&",$opschonen);
> $output = strtolower($email[0]);
> $vullen[]=$output;
> //echo"\n<br>".$output;
> }
> }
> }
>
> endwhile;
>
> sort($vullen);
> $telvullen = count($vullen);
> for($j=0;$j<$telvullen;$j++)
> {
> //print een emailadres maar 1 keer uit door te controleren of de
voorgaande
> en volgende array hetzelfde is
> if($vullen[$j-1]!=$vullen[$j] && $vullen[$j]!=$vullen[$j+1])
> {
> echo"\n<br>".$vullen[$j];
> }
> }
>
> //gooi de file weer dicht
> close(fd);
>
> ?>
>
> Ik heb alleen gemerkt dat niet alle adressen er uit worden gevist. Zo
wordt
> iets met bijvoorbeeld <a href="mailto:jemoer@hierduseenemail.info"> niet
> opgemerkt. Op zich logisch, want ik laat de boel ploffen op " ".
>
> Verder krijg ik soms achter een emailadres drie puntjes "..." of een ":"
> (direct aan het adres) of dit soort troep: h? of .°r of n`» en ga zo
> maar door.
>
> Heeft iemand een idee hoe ik een beter opdracht kan geven tot het vinden
van
> emailadressen en deze dan ook correct uit de file kan halen?
> Groeten,
>
> Matthijs
>
>
>
>
>

Daniel Tryba
11/03/05, 16:45
Matthijs de Z <haalallesvoorhetstreepjesplushetstreepjezelfweg-mldz@hotmail.com> wrote:
> if(eregi("^.[a-zA-Z0-9_.\.-]+@[a-z0-9_]+\\.[a-z]+",$opsplitsen[$i]))
> {
> $opschonen = ereg_replace('<','',$opsplitsen[$i]);
> $opschonen = ereg_replace('>','',$opschonen);
> $opschonen = ereg_replace(';','',$opschonen);
> $opschonen = ereg_replace('\(','',$opschonen);
> $opschonen = ereg_replace('\)','',$opschonen);
>
> //klaarmaken om het domein te herkennen
> $domein1 = explode("@",$opschonen);
> $domein2 = explode(".",$domein1[1]);
[knip]

Wat een zonde van cpu tijd. Je matched op iets wat op een email adress
lijkt en gaat vervolgens niet naar dat specifieke stuk kijken maar je
gaat allerlei zooi die niet matched weggooien.

zonder ook maar iets te testen lijkt me veel zinniger:

preg_match_all("([a-zA-Z0-9_.\.-]+@([a-z0-9_]+\\.[a-z]+))",$regel,$matches)

$matches bevat dan zowel alle dingen die aan die regexp voldoen, plus
een reference naar het domein.

Veel plezier met het verder tunen van de regexp :)

Matthijs de Z
11/03/05, 17:05
> zonder ook maar iets te testen lijkt me veel zinniger:
>
>
preg_match_all("([a-zA-Z0-9_.\.-]+@([a-z0-9_]+\\.[a-z]+))",$regel,$matches)

> $matches bevat dan zowel alle dingen die aan die regexp voldoen, plus
> een reference naar het domein.

Met de preg_match_all kwam Bas idd ook. Werkt prima (zie posting reply op
mezelf). Jij ook bedankt. Ik ga de rest ven het script opbouwen.
Groeten,

Matthijs

# martin
12/03/05, 10:55
Matthijs de Z schreef het volgende:
>> zonder ook maar iets te testen lijkt me veel zinniger:
>>
>>
> preg_match_all("([a-zA-Z0-9_.\.-]+@([a-z0-9_]+\\.[a-z]+))",$regel,$matches)
>
>> $matches bevat dan zowel alle dingen die aan die regexp voldoen, plus
>> een reference naar het domein.
>
> Met de preg_match_all kwam Bas idd ook. Werkt prima (zie posting
> reply op mezelf). Jij ook bedankt. Ik ga de rest ven het script
> opbouwen. Groeten,
>
> Matthijs

Wil je ons op de hoogte houden? Ik krijg ook veel e-mail adressen terug en
wil daar wel eens een eind aan maken ;-)

--
# martin

winamp - media - shoutcast - www.winampnederlands.nl

Matthijs de Z
12/03/05, 12:55
> >
preg_match_all("([a-zA-Z0-9_.\.-]+@([a-z0-9_]+\\.[a-z]+))",$regel,$matches)
> >
> >> $matches bevat dan zowel alle dingen die aan die regexp voldoen, plus
> >> een reference naar het domein.
> >
> > Met de preg_match_all kwam Bas idd ook. Werkt prima (zie posting
> > reply op mezelf). Jij ook bedankt. Ik ga de rest ven het script
> > opbouwen. Groeten,
> >
> > Matthijs
>
> Wil je ons op de hoogte houden? Ik krijg ook veel e-mail adressen terug en
> wil daar wel eens een eind aan maken ;-)

Druk weekend, maandag ga ik weer verder en zal mijn script hier posten. Ben
dan ook benieuwd wat andere er op te zeggen hebben. Het zal vast beter
kunnen ;-)

DIt werkt al prima:

<?php
set_time_limit(900);
$msg = file_get_contents("naam van de file");
preg_match_all("(([a-zA-Z0-9_]|\\-|\\.)+@(([a-zA-Z0-9_]|\\-)+\\.)+[a-zA-Z]{2
,4})",$msg,$emails);
$emailArray = array_unique($emails[0]);
sort($emailArray);
$telvullen = count($emailArray);
for($j=0;$j<$telvullen;$j++)
{
echo"\n<br>".$emailArray[$j];
}

?>

maar ik wil er nog een paar extra simpele dingen omheen zetten.
groeten,

Matthijs

# martin
12/03/05, 12:55
Matthijs de Z schreef het volgende:
>>> [...]
>>> Ik ga de rest ven het script
>>> opbouwen. Groeten,
>>>
>>> Matthijs

>> Wil je ons op de hoogte houden? Ik krijg ook veel e-mail adressen
>> terug en wil daar wel eens een eind aan maken ;-)

> Druk weekend, maandag ga ik weer verder en zal mijn script hier
> posten. Ben dan ook benieuwd wat andere er op te zeggen hebben. Het
> zal vast beter kunnen ;-)
> [...]

Ik vind je idee heel aardig en denk dat er wel meer mensen wat aan hebben.
Dus hopelijk gaat het je lukken, vooral ook om het simpel te maken :-)

--
# martin

winamp - media - shoutcast - www.winampnederlands.nl

John Bokma
12/03/05, 20:15
Matthijs de Z wrote:

>> >
> preg_match_all("([a-zA-Z0-9_.\.-]+@([a-z0-9_]+\\.[a-z]+))",$regel,
$matc
> hes)
>> >
>> >> $matches bevat dan zowel alle dingen die aan die regexp voldoen,
>> >> plus een reference naar het domein.
>> >
>> > Met de preg_match_all kwam Bas idd ook. Werkt prima (zie posting
>> > reply op mezelf). Jij ook bedankt. Ik ga de rest ven het script
>> > opbouwen. Groeten,
>> >
>> > Matthijs
>>
>> Wil je ons op de hoogte houden? Ik krijg ook veel e-mail adressen
>> terug en wil daar wel eens een eind aan maken ;-)
>
> Druk weekend, maandag ga ik weer verder en zal mijn script hier
> posten. Ben dan ook benieuwd wat andere er op te zeggen hebben. Het
> zal vast beter kunnen ;-)
>
> DIt werkt al prima:
>
> <?php
> set_time_limit(900);
> $msg = file_get_contents("naam van de file");
> preg_match_all("(([a-zA-Z0-9_]|\\-|\\.)+@(([a-zA-Z0-9_]|\\-)+\\.)+[a-
zA
> -Z]{2 ,4})",$msg,$emails);
> $emailArray = array_unique($emails[0]);
> sort($emailArray);
> $telvullen = count($emailArray);
> for($j=0;$j<$telvullen;$j++)
> {
> echo"\n<br>".$emailArray[$j];
> }
>
> ?>
>
> maar ik wil er nog een paar extra simpele dingen omheen zetten.
> groeten,

Iets a la:

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+

[ grote knip ]


?:\r\n)?[ \t])*))*)?;\s*)

? (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )

Oh, en ik lees daar dat je dan nog comments moet strippen :-D.

(Quote: Implementing validation with regular expressions somewhat
pushes the limits of what it is sensible to do with regular expressions,
although Perl copes well )

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Matthijs de Z
14/03/05, 18:25
> ? (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )

Ik vraag me dan af hè....WIE HEEFT DAT OOIT ZO GEDAAN???? Dan moet je toch
wel bijna in echtscheiding liggen wil je daar je tijd aan besteden ;-)

Matthijs de Z
14/03/05, 18:35
> >> Wil je ons op de hoogte houden? Ik krijg ook veel e-mail adressen
> >> terug en wil daar wel eens een eind aan maken ;-)

Dit werkt bij mij:

<?php
set_time_limit(900);
$msg = file_get_contents("file van de folder");
preg_match_all("(([a-zA-Z0-9_]|\\-|\\.)+@(([a-zA-Z0-9_]|\\-)+\\.)+[a-zA-Z]{2
,4})",$msg,$emails);

$aantal = count($emails);

$emailArray = array_unique($emails[0]);
sort($emailArray);
$telvullen = count($emailArray);
for($j=0;$j<$telvullen;$j++)
{
if (eregi("eigendomein", $emailArray[$j]) || eregi("tweede eigen domein of
server naam", $emailArray[$j]))
{
unset($emailArray[$j]);
}
}

$emailArray = array_unique($emailArray);
sort($emailArray);
$telvullen = count($emailArray);
for($j=0;$j<$telvullen;$j++)
{
echo"\n<br>".$emailArray[$j];
}

?>

John Bokma
14/03/05, 18:45
Matthijs de Z wrote:

>> ? (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )
>
> Ik vraag me dan af hè....WIE HEEFT DAT OOIT ZO GEDAAN???? Dan moet je
> toch wel bijna in echtscheiding liggen wil je daar je tijd aan
> besteden ;-)

Als je aardig in de regexpen zit leest het vrij natuurlijk. Daarnaast kan
je met de x optie whitespace toevoegen die niet meetelt, en het wat
leesbaarder schrijven.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Matthijs de Z
14/03/05, 18:45
> >> ? (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )
> >
> > Ik vraag me dan af hè....WIE HEEFT DAT OOIT ZO GEDAAN???? Dan moet je
> > toch wel bijna in echtscheiding liggen wil je daar je tijd aan
> > besteden ;-)
>
> Als je aardig in de regexpen zit leest het vrij natuurlijk. Daarnaast kan
> je met de x optie whitespace toevoegen die niet meetelt, en het wat
> leesbaarder schrijven.

Ik moet je eerlijk zeggen...ik schrok me rot.... Maar dat kan aan mij liggen
;-) Ga er wel een keer mee testen.
Mazzel,

Matthijs

John Bokma
14/03/05, 20:15
Matthijs de Z wrote:

>> >> ? (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )
>> >
>> > Ik vraag me dan af hè....WIE HEEFT DAT OOIT ZO GEDAAN???? Dan moet
>> > je toch wel bijna in echtscheiding liggen wil je daar je tijd aan
>> > besteden ;-)
>>
>> Als je aardig in de regexpen zit leest het vrij natuurlijk. Daarnaast
>> kan je met de x optie whitespace toevoegen die niet meetelt, en het
>> wat leesbaarder schrijven.
>
> Ik moet je eerlijk zeggen...ik schrok me rot....

Dat was de bedoeling. Meestal als men een email adres validator maakt werkt
die niet voor een berg adressen.

> Maar dat kan aan mij
> liggen ;-) Ga er wel een keer mee testen.

Als je Perl gebruikt kan je gewoon die module gebruiken. Geen idee of het
er voor PHP ook is.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Matthijs de Z
14/03/05, 23:05
> Als je Perl gebruikt kan je gewoon die module gebruiken. Geen idee of het
> er voor PHP ook is.

Ik gebruik gewoon pehape. Voor perl ben ik net iets te dom denk ik. Ik vind
PHP wat vriendelijker.
Mazzel,

Matthijs

Ronald Klip
15/03/05, 00:05
Matthijs de Z schreef:

(Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )
> > Als je Perl gebruikt kan je gewoon die module gebruiken. Geen idee of het
> > er voor PHP ook is.
>
> Ik gebruik gewoon pehape. Voor perl ben ik net iets te dom denk ik. Ik vind
> PHP wat vriendelijker.

In theorie zou die regexp moeten werken met preg_match(), in PHP. (De p
in preg komt van pcre, wat staat voor perl compatible regular
expressions.) Ik krijg echter de waarschuwing "Compilation failed:
unmatched parentheses at offset 768". Ergens staat een haakje niet goed
;)

--
http://www.europese-grondwet.nl/ informatie en opinie

John Bokma
15/03/05, 00:25
Matthijs de Z wrote:

>> Als je Perl gebruikt kan je gewoon die module gebruiken. Geen idee of
>> het er voor PHP ook is.
>
> Ik gebruik gewoon pehape. Voor perl ben ik net iets te dom denk ik. Ik
> vind PHP wat vriendelijker.

Vreemd, ik vind Perl stukken vriendelijker. Neem nu die enorme reguliere
expressie...


--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

John Bokma
15/03/05, 00:25
Ronald Klip wrote:

> Matthijs de Z schreef:
>
> (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )
>> > Als je Perl gebruikt kan je gewoon die module gebruiken. Geen idee
>> > of het er voor PHP ook is.
>>
>> Ik gebruik gewoon pehape. Voor perl ben ik net iets te dom denk ik.
>> Ik vind PHP wat vriendelijker.
>
> In theorie zou die regexp moeten werken met preg_match(), in PHP. (De
> p in preg komt van pcre, wat staat voor perl compatible regular
> expressions.) Ik krijg echter de waarschuwing "Compilation failed:
> unmatched parentheses at offset 768". Ergens staat een haakje niet
> goed ;)

Download voor de zekerheid de Perl module en copy paste. Als je dan nog die
fout krijgt gok ik dat de c in pcre niet compatible betekent maar: close
(but no cigar).


--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Ronald Klip
15/03/05, 11:05
John Bokma schreef:
> Ronald Klip wrote:
>
> > (Zie: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html )
> >
> > In theorie zou die regexp moeten werken met preg_match(), in PHP. (De
> > p in preg komt van pcre, wat staat voor perl compatible regular
> > expressions.) Ik krijg echter de waarschuwing "Compilation failed:
> > unmatched parentheses at offset 768". Ergens staat een haakje niet
> > goed ;)
>
> Download voor de zekerheid de Perl module en copy paste. Als je dan nog die
> fout krijgt gok ik dat de c in pcre niet compatible betekent maar: close
> (but no cigar).

OK. In de module blijkt de regexp niet uitgeschreven te staan, maar
wordt-ie stap voor stap opgebouwd. Als ik dat naar PHP ombouw en in
preg_match() toepas, lukt het wel. Vermoedelijk werden in poging 1
backslashes ten onrechte niet (of wel) ge-escaped. (sorry voor de
vaagheid maar ik heb tijd noch zin om er al te diep in te duiken)

Wel lastig om een syntactisch ongeldig emailadres te verzinnen ;)

--
http://www.europese-grondwet.nl/ informatie en opinie

John Bokma
15/03/05, 18:25
Ronald Klip wrote:

> Wel lastig om een syntactisch ongeldig emailadres te verzinnen ;)

:-D. Ja, van wat ik begreep is er nogal veel mogelijk.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html