[PHP] Eerste en laatse regel(s) uit string verwijderen

Pagina: 1
Acties:
  • 775 views

Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik hoop dat dit topic niet zo snel dicht is als de vorige. Ik wil zeggen dat de vorige problemen verholpen zijn en ik intussen al veel bij heb geleerd. Een week geleden wist ik nog -niks- over PHP. :)

Dit is geen vervolgtopic, maar een nieuwe vraag.

Sommigen weten al waar ik mee bezig ben, anderen niet, dus wederom de uitleg:

Ik haal een piped e-mail op uit stdin, deze wordt bewerkt en de output gaat naar een SMS API. (voorheen deed ik dit met de mailfunctie)

Plain text mailtjes uit stdin zijn geen probleem, pas als er een HTML mailtje wordt opgehaald, geeft dat een hoop rommel. Ik wil deze rommel eruit filteren.

Ik had een kant en klaar scriptje van internet geplukt, maar deze was niet echt hufterproof. Na veel testen kwamen er steeds meer gebreken naar boven. Na uren dingen aanpassen en verbeteren waren nog niet alle problemen verholpen, dus besloot ik om het anders aan te pakken.

Ik heb nu eigenhandig een filter gemaakt, die de plain text uit het mailtje moet vissen.

In plaats van:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
This is a multi-part message in MIME format.

------=_NextPart_000_02BB_01CA043A.6DE10C40
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

0708906 - 06-07-2009 22:35 - P 2 STORMSCHADE ACHTERKADE VIA POLDERWEG =
Eenh: VIA593 - Vianen - post Vianen - monitorcode

------=_NextPart_000_02BB_01CA043A.6DE10C40
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.6000.16850" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV>
<DIV>0708906 - 06-07-2009 22:35 - P 2 STORMSCHADE ACHTERKADE VIA =
POLDERWEG Eenh:=20
VIA593 - Vianen - post Vianen - monitorcode</DIV>
<DIV>&nbsp;</DIV></DIV></BODY></HTML>

------=_NextPart_000_02BB_01CA043A.6DE10C40--


Heb ik nu:

code:
1
2
3
4
5
6
7
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

0708906 - 06-07-2009 22:35 - P 2 STORMSCHADE ACHTERKADE VIA POLDERWEG Eenh: VIA593 - Vianen - post Vianen - monitorcode


------=_NextPart_000_02B2_01CA043A.53776BB0


Dit met behulp van:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    if (strpos($headers, "boundary=") !== false) {
    
        $splitplain = explode("Content-Type: text/plain;", $message);
        $splithtml = explode("Content-Type: text/html;", $splitplain[1]);
        $trimmed = trim($splithtml[0]);
        $clean = str_replace(array("=\n", "=20", "=3D"), array("", "", "="), $trimmed);
    
    } else {
    
        $clean = trim($message);

    }

Ook de = linebreak is geëlimineerd, dus de regel ziet er precies uit als wanneer het mailtje in plain text was verzonden.

Ik moet alleen nog een dingetje zien op te lossen:

De eerste twee regels en de laatste regel moeten weg. Daarna kan ik met trim de overbodige lege regels aan het einde en begin van de string weghalen.

Welke functie moet ik hier voor gebruiken? Het liefst een beetje newbie vriendelijk.

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Door een combinatie van de volgende functieaanroepen:

strpos
strrpos
substr

Aan jou de schone taak om de combinatie te bedenken ;)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Stop de aparte parts in een array, loop over de array tot je de part met text/plain vind, explode de part op het einde van de headers.

Het 'einde van de headers' is uitzoekwerk, en is zeer leerzaam voor het begrijpen van dit soort protocollen.

{signature}


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
bigbeng schreef op dinsdag 14 juli 2009 @ 06:02:
Door een combinatie van de volgende functieaanroepen:

strpos
strrpos
substr

Aan jou de schone taak om de combinatie te bedenken ;)
Ik weet niet zeker of dat bruikbaar is als de eerste 2 regels en de onderste regel variabel is qua tekst en lengte?
Voutloos schreef op dinsdag 14 juli 2009 @ 07:07:
Stop de aparte parts in een array, loop over de array tot je de part met text/plain vind, explode de part op het einde van de headers.

Het 'einde van de headers' is uitzoekwerk, en is zeer leerzaam voor het begrijpen van dit soort protocollen.
Verder dan dit kan ik het niet exploden.

Ik heb een keer een script gezien die mijn probleem oplost d.m.v. preg_match, maar dat mag toch alleen maar onder bepaalde condities worden gebruikt? Zo ver ben ik niet niet qua kennis. Ook de opties die gebruikt worden, vaak bestaande uit >/$)(#&# (ja ik ram maar even wat op mijn toetsenbord) snap ik niet. Is ook niet op te Googlen met die tekens.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
'Headers' tezamen met je bepaalde protocol is een prima zoekterm. Succes.

Uiteindelijk weet je gewoon (nog) niet hoe (in dit geval) mailtjes gedefinieerd zijn. Dan lees je daar eerst over in, voordat je Random TrucsTM gaat inzetten.

{signature}


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
De headers zitten niet in de te filteren string, deze zijn al gescheiden.

Het gaat echt om het bericht ($message) zelf, deze wordt zo opgehaald uit stdin.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
F4T4L_3RR0R schreef op dinsdag 14 juli 2009 @ 04:26:
De eerste twee regels en de laatste regel moeten weg.
Er zijn verschillende opties om het te doen. In pseudo code.

Methode 1
code:
1
2
3
4
5
6
var secondLineEndPos = FindSecondLineEnd( $myString );
var lastLineEndPos = FindLastLineEnd( $myString );
//Kan eventueel met een loopje geimplementeerd worden als er niet vanaf achter gezocht kan worden

var myString = SubString( $myString, firstLineEndPos, lastLineEndPos );
//Hier moeten /r/n nog verwijderd worden

Of methode 2
code:
1
2
3
4
array $lines = Split( $myString, $newLine );
var $newString
for( 2 to lines.Length - 1 )
    AppendToString( $newString, lines[i] );

Hoe je dat naar PHP moet vertalen mag je zelf uitzoeken, maar met de functies die bigbeng post moet je een heel eind kunnen komen.

[ Voor 15% gewijzigd door Woy op 14-07-2009 09:20 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
F4T4L_3RR0R schreef op dinsdag 14 juli 2009 @ 04:26:
intussen al veel bij heb geleerd
Als je dan nu nog leert om de help te raadplegen ;)
http://us.php.net/manual/en/ref.strings.php
http://www.w3schools.com/PHP/php_ref_string.asp
F4T4L_3RR0R schreef op dinsdag 14 juli 2009 @ 09:01:
Ik weet niet zeker of dat bruikbaar is als de eerste 2 regels en de onderste regel variabel is qua tekst en lengte?
Want? Heb je het al geprobeerd? Laat eens zien wat je had/hebt?
F4T4L_3RR0R schreef op dinsdag 14 juli 2009 @ 09:01:
Verder dan dit kan ik het niet exploden.
Want? Heb je het al geprobeerd? Laat eens zien wat je had/hebt?
F4T4L_3RR0R schreef op dinsdag 14 juli 2009 @ 09:01:
Ik heb een keer een script gezien die mijn probleem oplost d.m.v. preg_match, maar dat mag toch alleen maar onder bepaalde condities worden gebruikt?
Want? Wat zegt de documentatie?
F4T4L_3RR0R schreef op dinsdag 14 juli 2009 @ 09:01:
Ook de opties die gebruikt worden, vaak bestaande uit >/$)(#&# (ja ik ram maar even wat op mijn toetsenbord) snap ik niet. Is ook niet op te Googlen met die tekens.
Dat hoeft ook niet; als je kijkt bij (bijv.) preg_match dan kom je er achter dat de term die je zoekt "regular expressions" is en daar is wél prima op te googlen en is ook op php.net zat over te lezen.

Lezen, lezen, lezen. En verder kijken dan je neus lang is. Want alles wat je hier (en in voorgaande topics) vraagt is met een paar minuten in de documentatie neuzen te beantwoorden als je even je grijze massa laat werken.

Programmeren is wéten welke gereedschappen in je gereedschapskist zitten (lees: functies beschikbaar in de taal waarin je werkt) en wanneer je ze moet gebruiken (lees: wanneer je een functie gebruikt voor welk doel). Voor nieuwelingen is de documentatie dus onmisbaar (en overigens zelfs voor gevorderden ook). Programmeren is niet zomaar "willekeurig" wat "code" achter mekaar rammen en bidden dat 't werkt.

[ Voor 14% gewijzigd door RobIII op 14-07-2009 09:25 ]

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!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Ik zoek me helemaal suf op php.net en google, maar ik kan niks vinden op bijvoorbeeld "remove lines string php"...

Acties:
  • 0 Henk 'm!

  • GraveR
  • Registratie: Januari 2000
  • Laatst online: 22-08 19:26
Als ik het dus goed begrijp wil je eerst mime parsen en daaruit de tekst halen.

Ik zou dus beginnen de kale mail te strippen van overbodige bagger:

http://code.google.com/p/php-mime-mail-parser/
Voorbeeld met STDIN:
http://www.bucabay.com/20...ail-php-mime-mail-parser/

Die MIME-parser kan dus meteen onderscheid maken tussen het HTML- en tekstgedeelte.

Acties:
  • 0 Henk 'm!

  • tonyisgaaf
  • Registratie: November 2000
  • Niet online
Als je nou eerst eens probeert te begrijpen waar je naar zoekt in die string? Wat definiëert volgens jou een regel(einde)?
Een regel is nl. niet een entiteit op zich, die ontstaat impliciet a.d.h.v. control characters.

NL Weerradar widget Euro Stocks widget Brandstofprijzen widget voor 's Dashboard


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 08:56

Matis

Rubber Rocket

Je zou kunnen splitsen op regeleinde (0x0A)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 13-10 23:09

Creepy

Tactical Espionage Splatterer

Dat wil je ook helemaal niet. Je wilt een deel van een bericht parsen en dat is gewoon een string.

Stop nu eerst eens met direct te zoeken naar een kant en klare oplossing en begin eerst eens met logisch nadenken. Na je headers (charset en Content-Transfer-Encoding zijn een headers!) volgt een lege regel. Aan het einde van je bericht volgt een lege regel gevolg door een boundary (dat is de ------=_NextPart_000_02BB_01CA043A.6DE10C40--).

Als je dat allemaal weet dan is het met basis kennis van PHP een eitje om het bericht regel voor regel te lezen en te parsen. Programmeren is meer dan alleen een kant en klare oplossing proberen te googlen. Ondanks dat PHP voor bijna elke scheet een functie lijkt te hebben is dat natuurlijk niet altijd het geval ;)

Daarnaast ben je nu gewoon en e-mail parser aan het schrijven. Opzich helemaal niet erg en erg goed voor je kennis maar als je dat niet wil ga dan opzoek naar een class die dat voor je kan regelen en je direct de plain-text van een e-mail kan teruggeven.

Ik ga ook dit topic weer sluiten. Je lijkt er eht zelf wel mee aan de slag te willen gaan en aan je inzet lijkt het ook niet echt te liggen maar die zou op een iets ander vlak benut moeten worden. Doe eens een stapje terug, bekijk nu eens wat je binnen krijgt en wat daar uit moet rollen en ga daar eens mee aan de slag. Je wilt in elk geval totaal iets anders dan "de eerste twee regels verwijderen", en als je dat al echt wil is dat met basis PHP kennis echt eenvoudig op te lossen: Tip: lees het geheel regel voor regel in i.p.v. in 1 gigantische string, scheelt je weer splitten, regeleindes opzoeken etc. Bekijk ook even mijn signature want een regexp heb je absoluut niet nodig voor het parsen van e-mail.

[ Voor 41% gewijzigd door Creepy op 14-07-2009 10:44 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.