[PHP] Tekst uitlezen en explode.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 19-09 22:24
Hallo medetweakers,

Ben al een tijdje zoet met een probleem waar ik maar niet uit kom. Ik heb namelijk data van een website die ik uitlees. Maar nu is het op deze manier weergeven in het bestand van de externe website.

source_DN1=DN1 description
source_DN2=DN2 description
source_DN3=DN3 description

Enzovoort. nu heb ik het alsvolgt.

PHP:
1
2
3
4
5
6
7
8
9
$i=1;
$ex1 = explode('source_', $data);
sort($img);
while ($ex1[$number]){
    $ex2 = explode("=", $ex1[$number]);
    $var .= $ex2[0] . ";";
    $i++;
}
print_r(explode(";", $var);


Dit lijkt mij niet de juiste manier om te werken maar het werkt ook niet naar behoren. Hij pakt ondanks ik begin bij source_ en daarna explode naar = word er toch andere data opgehaald die totaal niet overeenkomt met de explode. En achteraf word er ook nog een lege array aangemaakt.

Daarnaast heb ik het in een for() geprobeerd maar dit had weinig nut aangezien het gewoon als vervanger word gezien van een while. Daarnaast geprobeerd met preg_match_all maar dan kreeg ik 1 terug of als ik dat werkend had kreeg ik een hoop rotzooi bij die ik niet nodig heb.

Aldus het bestand bevat ook andere waardes tussendoor dus de data is niet constant gelijk.

Weet iemand toevallig een betere manier of kan mij de goede richting op wijzen. Heb niet perse een hele code nodig zolang ik maar de beste manier kan aanleren. Aldus het zelf maken vanuit tips van jullie :)

Alvast bedankt!

Danny

Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Kijk eens wat er precies in de variabelen $number en $i zit. En waarom sorteer je $img?

Daarnaast misbruik je $var voor een array. Gebruik daar gewoon een array voor, dan hoef je op het einde niet te exploden...

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:47

MueR

Admin Tweakers Discord

is niet lief

Regel 2 van deze code is totaal nutteloos. Je wil exploden op newlines, een explode op 'source_' kan je net zo goed doen met substr(), is nog netter ook. Als het je het dan combineert met strpos ben je helemaal klaar. Of gebruik regexps.

[ Voor 6% gewijzigd door MueR op 18-01-2010 10:26 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Zou eerder zoiets doen denk ik:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$data = 'source_DN1=DN1 description
source_DN2=DN2 description
source_DN3=DN3 description';

$entries = explode("\n", $data);
$entries_cleaned = array();
foreach($entries as $entry)
{
    $entrydata = explode('=', $entry);
    $entries_cleaned[str_replace('source_', '', $entrydata[0])] = $entrydata[1];
}

print_r($entries_cleaned);


ongetest overigens

Acties:
  • 0 Henk 'm!

  • dwilmer
  • Registratie: Oktober 2008
  • Laatst online: 25-01 09:50
Ik denk dat regular expressions het hier ook best goed zouden kunnen doen. Wat ik zo snel heb gevonden, ik weet niet of het werkt in PHP, is dit: "/^source_.*$/m". De /m staat hierin voor multiline, waardoor ^ en $ niet meer staan voor begin en eind van de tekst maar voor begin en eind van de regel. In perl zou hij moeten werken.

Mocht je met Ubuntu Karmic werken, moet je in het Software Center het programma Kiki opzoeken. Ik vind het ideaal voor regular expressions.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik zie geen enkele reden dit met een regex te doen, de structuur is overduidelijk en makkelijk te splitsen op vaste karakters. Een paar explodes zijn vaak veel sneller dan een regex, en beter leesbaar ook maar das persoonlijk.

offtopic:
Laat een script moeten aanpassen wat via MSN login je contactlijst ophaalde, bleek gewoon een serverside login te doen en de html te zoeken op de mailadressen met...regexes. En t was dus stuk en die regex was een karakter of 300 lang :{ Ik heb mooi met 4 explodes de boel uit elkaar gehaald en bleek dat dit per request zo'n 15 seconden sneller was en bij een volgende aanpassing bij MSN kun je het ook makkelijker editten weer. Regexes? Ik probeer ze te vermijden waar mogelijk.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
sort($img) slaat nergens op of heeft hier niets mee te maken. $i wordt niet gebruikt. $number is undefined. Je error reporting staat uit.

Of misschien heb je $i en $number door elkaar gehaald of zo. Anyway, schoon het eerst op, kijk eens naar waar de variabelen vandaan komen en lees de manual van sort().

{signature}


Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 19-09 22:24
Antwoord op het sorteren is dat alles door elkaar staat en ik een geordende array/string wil krijgen wat hier wel nodig.

Verder was het script wel goed met de $i maar heb ik het fout overgetypt blijkbaar. aldus het antwoord op de vraag hierboven.

@cartman dat werkt niet naar behoren. Er zitten ook doelloze regels tussen waar ik niks van moet hebben. Denk dat ik dat in het voorbeeld had moeten verwerken het is namelijk meer zo:

source_DN1=DN1 description
testdf=test
testdfdfgdfg=test
source_DN3=DN3 description
testddff=test
testdsff=test
source_DN2=DN2 description
testdsff=test

Anders gezegt er zit geen logica in het bestand wat ik daadwerkelijk uitlees. Vandaar ik ook even dacht om het op 2 lijnen te doen aldus het explode. Zodat ik eerst het eerste deel eruit haal en vervolgens in een while het einde afbreken zodat ik alleen de nodige informatie krijg. Aldus moet ik uit deze string "source_DN3=DN3 description" DN3 aldus de DN3 voor de "=". Ga nu weer even kijken of ik ergens een oplossing gevonden kan krijgen hoop dat het nu misschien duidelijker is voor iedereen.

Alvast bedankt voor de bovenstaande reacties :)

Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Dan controleer je toch (binnen Cartmans foreach-loop) of de string "$entry" begint met "source_". Zo ja, doorgaan met de handeling; zo nee, verder gaan met de volgende entry...

Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 19-09 22:24
H004 schreef op maandag 18 januari 2010 @ 16:04:
Dan controleer je toch (binnen Cartmans foreach-loop) of de string "$entry" begint met "source_". Zo ja, doorgaan met de handeling; zo nee, verder gaan met de volgende entry...
Aha bedankt! Toen ik de foreach loop van cartmans gebruikte ging er iets niet helemaal goed leek erop maar met de check doet hij het een stuk beter! Zelf nog sneller en beter.

Bedankt Cartmans en ook H004! Ben ik weer een stuk wijzer geworden om iets uit te kunnen lezen. :o
Pagina: 1