d31-m01-Y2010 HTML naar plain text omvormen

Voor het versturen van e-mails in een privé-project had ik een functie nodig die een HTML-mail kon omvormen naar een plain text mail. Meestal wordt dit gedaan door simpelweg de PHP functie strip_tags op de HTML-mail los te laten. Dit geeft echter problemen als je bijvoorbeeld <style> tags in je code staan hebt. De strip_tags functie zal de begin- en eindtags wel 'strippen' maar zal alles ertussen laten staan. En een plain text mail met p { font-size: 12px; } en dergelijke in is nu niet echt proper. Daarom heb ik dus de functie getPlainText gemaakt.

De functie:

getPlainText

De uitleg:

// replace break rules with a linefeed and make sure a paragraph also ends with a new line
Hier gaan we dus <br /> tags vervangen door enters. En aangezien paragrafen ook moeten gescheiden worden van elkaar en meerdere paragrafen in de html op 1 regel kunnen staan zorgen we ervoor dat deze al in html vorm op verschillende lijnen staan.

// remove tabs
De tabs die door indentatie in de html-code staan mogen in de plain-text versie ook verwijderd worden.

// remove the head- and style-tags and all their contents
De reden waarom deze functie geschreven is. De strip_tags functie van php zal enkel de start- en eind-tags van deze elementen verwijderen, waardoor alles dat tussen deze tags staat behouden blijft. Door een preg_replace te doen van deze html-tags en hun inhoud is dit probleem opgelost.

// replace links with the inner html of the link with the url between ()
Indien je de parameter $includeAHrefs niet overschrijft met de waarde false zal deze regel de links in de html vervangen door de html die binnen de link staat met daarachter de url tussen haakjes. Dit zorgt ervoor dat links in je html-document niet verloren gaan, wat wel het geval is bij strip_tags.

// replace images with their alternative content
Hetzelfde voor de afbeeldingen. Deze regels zal de afbeelding vervangen door de alt parameter van het img-element.

// strip tags
En nu pas laten we de strip tags functie los op de tekst.

// replace 'line feed' characters with the 'carriage return/line feed' character pair
We vervangen de line feeds of "\n" karakters door het carriage return line feed paar zodat volgende regel kan uitgevoerd worden.

// replace double, triple, ... line feeds to one new line
Deze regel zorgt ervoor dat de overbodige witregels in de tekst vervangen worden door 1 witregel.

// decode html entities
Deze regel zal html entiteiten zoals &eacute; vervangen door hun plain text waarden (in dit geval dus é) door middel van de Spoon functie htmlentitiesDecode. Voor meer info over Spoon kan je terecht op spoon-library.be.
Als je niet met Spoon werkt kan je hier natuurlijk ook altijd de standaard php functie html_entity_decode gebruiken.

Een voorbeeld:

Als voorbeeld wou ik de Netlash nieuwsbrief van 21 januari even door deze functie halen.

Bekijk achtereenvolgens eens de originele nieuwsbrief, de plain text inhoud gemaakt met strip_tags en de plain text inhoud gemaakt met getPlainText.

Opmerkingen:

Zodat jullie ze niet meer moeten geven, enkele opmerkingen:

  • Niet alle html karakters worden goed vervangen.
  • Afhankelijk van de html code zullen er hier en daar toch nog meerdere witregels staan.
  • Het beste resultaat wordt natuurlijk nog altijd verkregen als je zelf de plain inhoud van je nieuwsbrief maakt.

Nog opmerkingen zijn uiteraard welkom :-)

Update (13/02/2010)

De nieuwe versie kan je hier vinden.
Het resultaat op de Netlash nieuwsbrief van 21 januari vind je hier.

Wat is er veranderd?

  • hoofdingen worden nu aangeduidt door **
  • lijst items worden aangeduidt met -
  • na hoofdingen, paragrafen en lijst items worden er witregels geplaatst
  • script elementen worden nu ook gestript zodat de functie niet enkel voor e-mail nieuwsbrieven geschikt is

Dit maakt het geheel nog beter leesbaar en zorgt voor een minimum aan opmaak.

***

Reacties

Bramus! Bramus!
d31-m01-Y2010

Nice, edoch een paar aanvullingen:
- <script> blokken zou ik ook nog wissen (analoog met style)
- meerdere witregels kan je ook nog met een regex wegwerken

annelyze annelyze
d31-m01-Y2010

@Bramus: aangezien script tags weinig of nooit gebruikt worden in nieuwsbrieven heb ik de script tag niet meegenomen in de functie maar inderdaad, voor wie het nodig is om ook deze tags te strippen is het maar kwestie van de regel waar de style tags gestript worden te dupliceren en aan te passen.

Wat betreft de meerdere witregels heb ik net gemerkt (bij het selecteren van de volledige gestripte tekst) dat de witregels die er nog tussen staan spaties bevatten. Verwacht hier dus nog maar een update ;-)

Tim Tim
d02-m02-Y2010

Misschien nog een loopje en elke lijn een trim() toevoegen?

Terrasoverkapping Terrasoverkapping
d13-m04-Y2010

coole oplossing. @bramus; voor spaces gebruik ik ook idd regular expressions, werkt prima!

thx voor posting

***

Reageer op dit bericht

*: verplichte velden