[php] Email adressen uit een string filteren?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 184193

Topicstarter
Ik heb een string met daarin een zooi informatie wat er zo uitziet:

Janssen, Jan
E-mailadres(sen):
janjanssen@planet.nl

De Vries, Willem
E-mailadres(sen):
w.devries@chello.nl

De Groot, Hendrik
E-mailadres(sen):
hendrik@degroot.nl

Nou wil ik alleen de emailadressen allemaal in een array hebben. Ik heb het als volgt geprobeerd, maar dat werkt dus niet helemaal ($all is de string met alle informatie erin, en ik weet dat er 94 mensen in de string zitten):

PHP:
1
2
3
4
5
6
7
8
9
$emails = explode("E-mailadres(sen):", $all);

for ($i = 1; $i <= 94; $i++) {
    $onlyemails[$i] = eregi(".* ([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)[ |,|.].*","\\1",$emails[$i]); 
}

for ($i = 1; $i <= 94; $i++) {
    echo $i.". ".$onlyemails[$i]."<br>";
}


Ik kan op zich wel eenmalig 94 keer die emailadressen er handmatig uit halen, maar ik heb nog 25 van die strings/lijsten, dus een goede oplossing zou welkom zijn. Ik had al wat gezocht, maar kon alleen dingen vinden om 1 emailadres eruit te vissen bijvoorbeeld.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-06 21:17
Ik zou het met een preg_match_all() proberen. Met een pattern als volgend zou je een heel eind moeten komen
code:
1
/([a-z0-9.-]+)@([a-z0-9.-]+).([a-z]{2,5})/iU

Acties:
  • 0 Henk 'm!

Anoniem: 184193

Topicstarter
ik heb dat toegepast, ik weet niet of het de juiste manier is, maar het doet niks:

PHP:
1
2
3
preg_match_all("/([a-z0-9.-]+)@([a-z0-9.-]+).([a-z]{2,5})/iU", $all, $onlyemails);   

print_r($onlyemails);


Geeft zoiets:

[57] => riannevdpol@hotm [58] => moppie0@hotm [59] => poldervaart@quic [60]

Acties:
  • 0 Henk 'm!

Anoniem: 184193

Topicstarter
Dit ook geprobeerd, geeft ook niet het juiste resultaat:

PHP:
1
2
3
4
5
6
7
8
$emails = explode("E-mailadres(sen):", $all);
for ($i = 1; $i <= 94; $i++) {
    preg_match('^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-])*\.[a-zA-Z]{2,4}$/^',$emails[$i], $onlyemails[$i]);
}

for ($i = 1; $i <= 94; $i++) {
    echo $i.". ".$onlyemails[$i]."<br>";
}

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Anoniem: 184193 schreef op donderdag 05 oktober 2006 @ 17:48:
ik heb dat toegepast, ik weet niet of het de juiste manier is, maar het doet niks:

PHP:
1
2
3
preg_match_all("/([a-z0-9.-]+)@([a-z0-9.-]+).([a-z]{2,5})/iU", $all, $onlyemails);   

print_r($onlyemails);


Geeft zoiets:

[57] => riannevdpol@hotm [58] => moppie0@hotm [59] => poldervaart@quic [60]
Als je goed kijkt naar die regex en naar het aantal tekens achter het apenstaartje dan weet je ook waarom ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 16-06 08:51

Pyrus

Hardknock life

kun je niet iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
preg_match_all("/E-mailadres(sen):\n(.*)\n\n/U", $all, $mailadressen);

$adressenlijst=array();

for($i=0;$i<count($mailadressen[1]);$i++)
{
  $adressenTemp=explode("\n",$mailadressen[1][$i]);
  foreach($adressenTemp as $adres)
  {
    $adressenlijst[]=$adres;
  }
}

doen...

Waarschijnlijk klopt die code voor geen kant, maar het maakt wel m'n idee duidelijk ;)
Pregmatchen op alles wat tussen e-mailadressen: en de dubbele linefeed tussen het mail-adres en de nieuwe naam staat en daarna exploden op linefeeds, zodat als er meer adressen staan je die mooi gescheiden hebt :)

Dit is natuurlijk er van uitgaande dat er alleen maar geldige adressen in je bestand voorkomen en dit niet ook nog eens moet checken.

LinkedIn


Acties:
  • 0 Henk 'm!

Anoniem: 184193

Topicstarter
Ik heb wat inspiratie opgedaan en heb het zo opgelost:

PHP:
1
2
3
4
5
6
7
8
9
$emails = explode(",", $all);

$count = 0;
for ($i = 0; $i <= 188; $i++) {
    if (eregi("[a-z0-9\._-]+@[a-z0-9\._-]+\.+[a-z]{2,4}", $emails[$i], $regs)){
        $allemails[$count] = $regs[0];
        $count++;
    }
}


Is er een functie in php om te checken of er dubbele waarden (emailadressen) in een array zitten en deze te verwijderen?

[ Voor 6% gewijzigd door Anoniem: 184193 op 05-10-2006 18:29 ]


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 15-06 21:02
array_unique()

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Anoniem: 184193 schreef op donderdag 05 oktober 2006 @ 18:25:
Ik heb wat inspiratie opgedaan en heb het zo opgelost:

PHP:
1
2
3
4
5
6
7
8
9
10
$newall = str_replace("E-mailadres(sen):", ",", $all);
$emails = explode(",", $newall);

$count = 0;
for ($i = 0; $i <= 188; $i++) {
    if (eregi("[a-z0-9\._-]+@[a-z0-9\._-]+\.+[a-z]{2,4}", $emails[$i], $regs)){
        $allemails[$count] = $regs[0];
        $count++;
    }
}


Is er een functie in php om te checken of er dubbele waarden (emailadressen) in een array zitten en deze te verwijderen?
anders kijk even door de array functies: http://nl3.php.net/manual/en/ref.array.php

en dan specifiek: http://nl3.php.net/manual/en/function.array-unique.php
Removes duplicate values from an array
te laat hehe

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • getty
  • Registratie: Januari 2001
  • Laatst online: 13-05 21:30
Voila.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$newall = str_replace("E-mailadres(sen):", ",", $all);
$emails = explode(",", $newall);

$allEmails = array();

foreach ($emails as $k => $email) {
    if (eregi("[a-z0-9\._-]+@[a-z0-9\._-]+\.+[a-z]{2,4}", $email, $regs)){
        $allEmails[] = $regs[0];
    }
}

$allEmails = array_unique($allEmails);

A computer is almost human - except that it does not blame its mistakes on another computer.


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-06 21:17
Vergeet het .museum-TLD niet ;)

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16-06 13:37

pietje63

RTFM

Kun je niet beter wachten op een spatie of een komma? Ik zie namelijk ook wel problemen optreden bij e-mailadressen van subdomeinen.. bijv @nl.pwc.com

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Anoniem: 28333

als het hele bestand er zo uit ziet kan het toch veel simpeler dan met al die regexen?
PHP:
1
2
3
4
5
6
7
8
9
10
$regels = explode("\n",$str);
$email = array();

for($i =0; $i < count($regels); $i++)
{
    if($i % 4 == 2)
    {
        $email[] = $regels[$i];
    }
}


en anders exploden op 2 enters (\n\n) en vervolgens met die blokken nog een keer exploden op 1 enter (\n), en dan het 3e element pakken?

[ Voor 21% gewijzigd door Anoniem: 28333 op 06-10-2006 15:25 ]


Acties:
  • 0 Henk 'm!

  • Technicality
  • Registratie: Juni 2004
  • Laatst online: 15-06 18:52

Technicality

Vliegt rechtsom...

Anoniem: 28333 schreef op vrijdag 06 oktober 2006 @ 15:24:
als het hele bestand er zo uit ziet kan het toch veel simpeler dan met al die regexen?
PHP:
1
2
3
4
5
6
7
8
9
10
$regels = explode("\n",$str);
$email = array();

for($i =0; $i < count($regels); $i++)
{
    if($i % 4 == 2)
    {
        $email[] = $regels[$i];
    }
}


en anders exploden op 2 enters (\n\n) en vervolgens met die blokken nog een keer exploden op 1 enter (\n), en dan het 3e element pakken?
Maar 'al die regexen' zorgen wel voor een goed resultaat, en zeg nou zelf, het is een stuk netter ;) Wat nou als er één regeltje ontbreekt bij die van jouw ;)

Acties:
  • 0 Henk 'm!

Anoniem: 14829

Waarom 'al die regexen' een stuk netter zou zijn ontgaat me een beetje. Behalve dan dat wanneer ze werken ze netter zijn dan Kage's oplossing, die werkt nl. niet wanneer iemand meerdere email adressen heeft. ;)
Maar een beetje voortbordurend op Kage's benadering zou ik op zoiets komen (pseudocode, want m'n php is wat roestig):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$regels = explode("\n",$str); 
$email = array(); 

for($i =0; $i < count($regels); $i++) 
{
    $regel = $regels[$i]; 
    if(($regel bevat alleen geldige tekens) &&
       ($regel bevat 1 '@', maar niet als eerste teken) &&
       ($regel heeft na '@' minimaal 1 '.') &&
       (tussen alle '.' en '@' karakters zit minimaal 1 ander karakter))
    { 
        // yep, dit kon wel 's een email adres zijn :-)
    } 
}

Beter leesbaar, beter onderhoudbaar, en je hoeft er ook geen cursus 'regex voor gevorderden' voor te volgen om te snappen wat er gebeurt. :)

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-06 21:17
Je zoekt e-mailadressen in een bestand. Het is dan niet meer dan logisch met een regexp die adressen te zoeken. Gewoon regels tellen en hopen dat het bestandsformaat niet is veranderd is imho een plakbank-oplossing.

Acties:
  • 0 Henk 'm!

Anoniem: 14829

fricky, reageer je op mij of op Kage? Indien op mij, kijk dan nog 's naar die pseudocode. Daar worden geen regels geteld, maar wordt iedere regel gecheckt of 't een possible valid email address is.
Ik geloof direct dat dat ook met goede regexen kan, maar krijg daar altijd een "bend over backwards" associatie bij... ;)
Mijn fout, ik weet 't, maar ik wil meestal graag ook over een jaar of zo m'n code nog kunnen begrijpen, of ervan uit kunnen gaan dat m'n collega's ook nog snappen wat er gebeurt.

Edit: wanneer iemand deze checks in een regex kan omzetten (en documenteren), dan hoor ik 't graag, en ga ik regular expressions ook als optie zien voor de not-so-straightforward filters:
code:
1
2
3
4
    if(($regel bevat alleen geldige tekens) &&
       ($regel bevat 1 '@', maar niet als eerste teken) &&
       ($regel heeft na '@' minimaal 1 '.') &&
       (tussen alle '.' en '@' karakters zit minimaal 1 ander karakter))

O ja, ik vergat nog 1 ding: op de 1e positie mag geen '.' staan.

[ Voor 33% gewijzigd door Anoniem: 14829 op 06-10-2006 16:40 ]


Acties:
  • 0 Henk 'm!

Anoniem: 49627

Gebaseerd op bovenstaande data
code:
1
2
3
als regel apenstaartje bevat dan
   voeg regel toe aan email adressen
einde als

Acties:
  • 0 Henk 'm!

Anoniem: 14829

:+ Geniale oplossing mark, en met de geboden data zal 't ook nog 's prima werken! :)

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16-06 13:37

pietje63

RTFM

In de voorbeeld data kun je niet zien wat er gebeurt als iemand meerdere e-mail adressen heeft. komen die onder elkaar, achterelkaar,??

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!

Pagina: 1