Hoe pak je karakters voor een string?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Furio Scripting

Furio Scripting

25/08/2016 14:09:17
Quote Anchor link
Beste forumleden,

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?
 
PHP hulp

PHP hulp

24/04/2024 21:36:40
 
- Ariën  -
Beheerder

- Ariën -

25/08/2016 14:19:47
Quote Anchor link
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 ;-).
 
Furio Scripting

Furio Scripting

25/08/2016 14:40:25
Quote Anchor link
- 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 ;-).


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...
 
Thomas van den Heuvel

Thomas van den Heuvel

25/08/2016 18:40:44
Quote Anchor link
Wat je nu doet is informatie kopiëren van B naar C. En die externe partij haalt dit wss ook uit een systeem A en kopieert het vervolgens naar B (een e-mailbericht). Dit is duplicatie van informatie. Handmatige duplicatie zelfs. En dat kan nogal foutgevoelig zijn.

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...
 
Ivo P

Ivo P

25/08/2016 19:46:11
Quote Anchor link
als je er vanuit mag gaan dat de mail automatisch door een script wordt aangemaakt en de opbouw altijd gelijk is, dan wordt het iets als

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

$b
= preg_match('#Orders (\d+) stuks#', $string, $aMatches);

?>


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....
 
Thomas van den Heuvel

Thomas van den Heuvel

25/08/2016 20:03:08
Quote Anchor link
@Ivo mja een XML-voorbeeld is doorgaans niet hetzelfde als een XML-spec :p.
 
Ivo P

Ivo P

26/08/2016 07:46:13
Quote Anchor link
helaas voor die Inders toen wel.
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.
 
Ramon van Dongen

Ramon van Dongen

26/08/2016 11:01:33
Quote Anchor link
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.
 
Ivo P

Ivo P

26/08/2016 11:06:08
Quote Anchor link
Pas daarbij wel op, dat de woorden Orders en stuks misschien wel meerdere keren in de tekst kunnen staan.

Met een regex kun je controleren op
"Orders "
gevolgd door 1 of meer cijfers
gevolgd door " stuks"
 
Willem vp

Willem vp

26/08/2016 12:15:41
Quote Anchor link
Ivo P op 25/08/2016 19:46:11:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$b
= preg_match('#Orders (\d+) stuks#', $string, $aMatches);
?>

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$b
= preg_match('#^Orders (\d+) stuks#m', $string, $aMatches);
?>

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).
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.