Toon posts:

[PHP] txt-bestand met alleen emailadressen uitlezen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Een tijd geleden heb ik een PHP-pagina gemaakt om emailadressen uit een geexporteerd txt-bestand te importeren. Het txt-bestand heeft de volgende inhoud:

"Naam 1" <emailadres1@hotmail.com>;
"Naam 2" <emailadres2@gmail.com>;
"Naam 3" <emailadres3@outlook.com>;

Etc.

Om dit uit elkaar te halen en de emailadressen 1 voor 1 in de database te stoppen gebruik ik deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$bestandnew = $_FILES['bestand']['tmp_name'];

$fopen = fopen($bestandnew, "r");
$data = fread($fopen, 8192000);
fclose($fopen);

$regels = "$data";

$regels = str_replace (' ','',$regels);
$regels = str_replace ('<','[',$regels);
$regels = str_replace ('>',']',$regels);

$regels = explode('\n',$regels);

foreach ($regels as $regel) {
  $rechts = explode(']', $regel);
  foreach ($rechts as $bijna) {
    $emailadres = explode('[', $bijna);
    if (!is_null($emailadres[1])) { INSERT IN DATABASE CODE HIER }
  }
}


Dit ging altijd goed. Nu probeer ik alleen een nog simpeler lijstje te importeren dat er zo uitziet:

emailadres1@hotmail.com
emailadres2@gmail.com
emailadres3@outlook.com

En nu lukt het me niet meer. Met explode zocht ik eerst natuurlijk op [ en ] maar nu is het meteen goed eigenlijk. Maar het komt ook binnen als 1 regel lijkt het wel. Niet meer lijn voor lijn. Ik zit al 2 uur te stoeien om wat explodes uit de loop te halen, en ook met fgets maar na een paar uur klooien zie ik het niet meer. Waarschijnlijk zou het makkelijker moeten zijn, maar ik kom er even niet meer uit. Any tips?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Een bestand regel-voor-regel lezen kan met fgets.

Acties:
  • 0 Henk 'm!

  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 16:23
Je kunt dan toch gewoon
PHP:
1
2
3
4
5
6
$regels = explode("\n",$data);

foreach ($regels as $regel) {
    $emailadres = trim($regel);
    if ($emailadres != '') { INSERT IN DATABASE CODE HIER }
}

Gebruiken?
Of inderdaad een loop met fgets zoals HuHu aangeeft.

Edit:
Dat het als 1 regel komt zou best wel eens kunnen komen doordat je split op '\n' en niet op "\n" (dat is verschillend).

[ Voor 20% gewijzigd door Gtoniser op 18-08-2015 16:11 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, ik had fgets geprobeerd maar helaas zonder resultaat. Ik had letterlijk geen enkel resultaat. Het lijkt wel of er geen \n (harde returns) tussen de regels in het txt-bestand zitten, ook al zie ik ze wel onder elkaar staan. Bedankt, ik ga het nog even verder proberen.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Gebruik en gebruikte je "\n" of '\n'? ;)

Acties:
  • 0 Henk 'm!

  • Dark_f
  • Registratie: Juli 2009
  • Laatst online: 06-12-2024
Gebruik PHP_EOL inplaats van \n. Dit werkt beter onder verschillende betandsformaten

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruikte '\n' maar dat werkte volgens mij wel bij mijn oude script. Of er werd daar gewoon ook overheen gelezen... ;)

Anyway, met de code van Gtoniser is het inmiddels gelukt! :) :) :)

Ik ga alleen deze if ($emailadres != '') nog even aanpassen/uitbreiden dat er ook een @ en . in moet zitten, want soms zit er verkeerde invoer zoals - in mijn aangeleverde lijst.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dark_f schreef op dinsdag 18 augustus 2015 @ 16:20:
Gebruik PHP_EOL inplaats van \n. Dit werkt beter onder verschillende betandsformaten
Okee, top, staat genoteerd. :)

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 17:04
En hier heb je nog wat validatie documentatie mocht je die nog nodig hebben ;)

http://php.net/manual/en/filter.examples.validation.php

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RedHat schreef op dinsdag 18 augustus 2015 @ 16:23:
En hier heb je nog wat validatie documentatie mocht je die nog nodig hebben ;)

http://php.net/manual/en/filter.examples.validation.php
Ik zag hem net:
code:
1
if(filter_var("some@address.com", FILTER_VALIDATE_EMAIL))


:)

Gaat helemaal goed komen! Bedankt allen! :)

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Gezien je vraag/antwoordstelling verwacht ik het niet, maar toch: weet dat het gebruik van streams (en fgets) veel geheugen kan schelen in php. Het gehele bestand uitlezen als string en exploden op nieuwe regels zet alles in je geheugen.

De huidige oplossing is best prima voor tientallen adressen, ga je serieus e-mailadressen importeren kan je beter het ding herschrijven naar streams.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okee, bedankt weer. Ook deze tip zal ik in commentaar erbij zetten op mijn pagina. Het zijn nu toch wel aardig wat adressen, bijna 8000.

Acties:
  • 0 Henk 'm!

  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 16:23
Dark_f schreef op dinsdag 18 augustus 2015 @ 16:20:
Gebruik PHP_EOL inplaats van \n. Dit werkt beter onder verschillende betandsformaten
Bij het schrijven van bestanden wel, maar bij het lezen zeker niet. Als je een bestand met \n regeleindes hebt en je split die op Windows met PHP_EOL gaat het niet werken.
In dit geval kun je beter op \n splitten, de eventueel overgebleven \r haalt de trim() wel weg.

Acties:
  • 0 Henk 'm!

  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 12-10 15:15

xleeuwx

developer Tweakers Elect
Naar mijn ervaring is het beter / gemakkelijker om met een functie (bijv. fgets) de regel uit te lezen dit werkt in praktijk beter als je bijvoorbeeld niet weet van welk os het bestand afkomt daarnaast is het duidelijker in de code. Daarna kan je een pregmatch doen op < en dan rtrim op >
Pagina: 1