Hoe pak je karakters voor een string?
Ik heb een email met daarin variable content welke in een tabel staan:
Beste furio scripting,
Hierbij de daily report met de informatie verwerkt tot 25-08-2016.
Highlights van gisteren (woensdag)
Inbound -
Voorraad 1 artikel met voorraad die niet op LvB staat
Orders 156 stuks zijn besteld
Retouren 4 retourverzoeken zijn aangemeld
Nu wil ik via php zien hoeveel orders we hebben gehad, dus de 156...
Hoe krijg ik dit voor elkaar?
Ik heb het idee dat je vraag maar half gesteld wordt, gezien dit een vrij makkelijke vraag is ;-).
- Ariën - op 25/08/2016 14:19:47:
Niet veel meer spannends dan een SELECT-query waarbij je de waar de query fetch'ed.
Ik heb het idee dat je vraag maar half gesteld wordt, gezien dit een vrij makkelijke vraag is ;-).
Ik heb het idee dat je vraag maar half gesteld wordt, gezien dit een vrij makkelijke vraag is ;-).
Ja als ik de waardes in de database had staan was dit zeer gemakkelijk inderdaad maar het gaat om een mail die door een externe partij verzonden word.
Via imap_open lees ik het mailtje uit.... nu wil ik de content scannen en enkel de orders van vandaag uitlezen... waarschijnlijk via een regex of iets?
Misschien kunnen we zeggen in php: Pak de waarde Na "Orders" en voor "stuks". Daar staat namelijk de 156 die we nodig hebben...
Als jullie nu eens allen uit eenzelfde bron lezen (webservice? export?) of in ieder geval het dataverkeer standaardiseren (xml? json?) in plaats van deze adhoc oplossing waarbij je e-mailberichten aan het ontleden bent :/.
Een regexp gaat al mis wanneer de opsteller van het bericht in een creatieve bui is en deze aantallen op een andere manier verwoordt in een zin...
in $aMatches kun je dan gaan kijken wat je nodig hebt (waarschijnlijk $aMatches[1])
Let wel: wat als er 0 orders zijn. Staat er dan 0? of vervalt in zo'n geval de regel?
Wat als de mail een keer een dag oversloeg? Kan er na het weekend bijvoorbeeld een opgave over 2 of 3 dagen zijn?
@Thomas: soms is het niet mogelijk om in A te kijken, of om de andere partij iets te laten aanpassen.
Ik heb het ooit heel snel opgegeven toen Indiërs uiteindelijk onaangekondigd inderdaad mijn suggestie voor xml overnamen, maar daarbij gewoon letterlijk het 3 regelige voorbeeld-xmltje gebruikten en alle nodige informatie in de andere 20 velden achterwege lieten. Dan maar liever html regexen....
@Ivo mja een XML-voorbeeld is doorgaans niet hetzelfde als een XML-spec :p.
En orders zonder competer product spec. en zonder afleveradres gaan echt niet lukken
Toevoeging op 26/08/2016 10:05:20:
Maar terug naar TS:
uitelkaar puzzelen van de email kán wel, maar is dus duidelijk niet de meest stabielste oplossing, maar zolang je proces niet heel kritisch is, kan het wel.
Hou rekening met
* mails die een dag niet aankomen
* mails die een dag later alsnog aankomen
* mails met meerdere gegevnes erin
* plotselinge onaangekondigde aanpassing van de inhoud van de mail (ook bijvoorbeeld dat het getal bold wordt en er tussen "orders " en het getal ineens een html-tag verschijnt.
* of dat in de content van de mail zowel een plain-text als een html-versie aanwezig is / komt
Of wat als er minder dan 100 orders zijn: krijg je dan een extra spatie?
Maar als je niet anders kunt: het is wel mogelijk.
Quote:
Misschien kunnen we zeggen in php: Pak de waarde Na "Orders" en voor "stuks". Daar staat namelijk de 156 die we nodig hebben...
ALS de e-mail steeds hetzelfde is qua opzet in grote lijnen zou ik de e-mail body in een variabele zetten, alles t/m 'Orders' verwijderen, alles vanaf 'stuks' verwijderen, alles wat dan overblijft omzetten naar een getal en voila.
Met een regex kun je controleren op
"Orders "
gevolgd door 1 of meer cijfers
gevolgd door " stuks"
Ivo P op 25/08/2016 19:46:11:
Zo te zien aan het voorbeeld staat 'Orders' aan het begin van een regel. In dat geval zou je de regex zelfs nog iets specifieker kunnen maken:
Door de m-modifier te gebruiken verwerk je $string als multiline string, waardoor de ^ matcht aan het begin van elke regel (in plaats van alleen aan het begin van $string).