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:
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 é 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.
(Deze blogpost is geschreven door Netlash webdevelopster Annelies, en verscheen eerst op haar persoonlijke blog.)


Door Stijn 03/02/10 (5 maanden geleden)
re: HTML naar plain text omvormen
Mooi gemaakt!
Alleen heb ik nog opmerking.
Doordat je de links verwijderd uit je HTML mail, heb je geen uitgaande links meer in je text versie.
Het zou handig zijn mocht je de uitgaande links aanduiden en de links in tekst erbij zetten.
Bv.
Ik ben een link(1) in de nieuwsbrief
Waarbij je dan onderaan de links onderaan zet.
Links:
1. http://www.ikbeneenlink.be
Door Stijn 03/02/10 (5 maanden geleden)
re: HTML naar plain text omvormen
En eventueel nog een opmerking zijn de titels (H1, H2, H3, ..) aan te duiden.
Met bv.
*Ik ben een titel*
/Ik ben een titel/
Door Andries Seutens 03/02/10 (5 maanden geleden)
re: HTML naar plain text omvormen
Mooi gemaakt, ik kon het niet laten om ook eens een poging te wagen. Dus bij deze: http://pastebin.com/f106d6d7b
Door Suzanne Thienpont 11/02/10 (5 maanden geleden)
re: HTML naar plain text omvormen
Bedankt voor de functie. Het is veel handiger dan de strip_tags functie.
Door Bartjan Cazander 15/02/10 (5 maanden geleden)
re: HTML naar plain text omvormen
Normaal zou ik gewoon de tekst kopiëren naar notepad/kladblok, maar ik hoef dit dan ook vrijwel nooit te doen.
Ik zie op je persoonlijke blog dat je die "mooi bijpassende afbeelding" niet zelf hebt uitgezocht ;-)
Door Leenen Raf 18/02/10 (5 maanden geleden)
re: HTML naar plain text omvormen
Bedankt voor deze tip te delen, eens zien of mij ook kan helpen.
Door Dell A 02/03/10 (4 maanden geleden)
re: HTML naar plain text omvormen
Bedankt en een compliment!
Door Glemma Digital Creativity 03/03/10 (4 maanden geleden)
re: HTML naar plain text omvormen
Goede code heb je gemaakt. Vooral dat de strip_tags niet meer gebruikt word. Ik heb dat probleem vaker gehad met een script dat ik maakte voor een mailinglist. Dit is een erg goede code en daarbij ook een erg goede uitleg! Mijn compliment!
Door Hamsterkäfig 10/03/10 (4 maanden geleden)
re: HTML naar plain text omvormen
Bedankt voor deze tip te delen, eens zien of mij ook kan helpen.
Door SIM Only 11/03/10 (4 maanden geleden)
re: HTML naar plain text omvormen
Bedankt voor het delen van je tips 'n' tricks, hier kan ik iets mee!
Door 5235 15/03/10 (4 maanden geleden)
re: HTML naar plain text omvormen
Bedankt! Erg interessante tip
Door Terrasoverkapping 13/04/10 (3 maanden geleden)
re: HTML naar plain text omvormen
btw, voor witspaces kan je dus ook regular expressions (regex) gebruiken! maar desalnittemin werkt het zo ook. thx.
Door Mark 15/04/10 (3 maanden geleden)
re: HTML naar plain text omvormen
Dit heeft me al veel tijd bespaard! Bedankt voor het te delen.
Door netlash 02/02/10 (5 maanden geleden)
stript op het Netlash blog: http://www.netlash.com/blog/detail/html-naar-plain-text-omvormen
Door webdesignblogs 02/02/10 (5 maanden geleden)
HTML naar plain text omvormen - Blog - Netlash Webdesign: Voor het versturen… http://goo.gl/fb/W4Ly #webdesign
Door webdesignblogs 02/02/10 (5 maanden geleden)
HTML naar plain text omvormen - Blog - Netlash Webdesign: Voor het versturen… http://goo.gl/fb/27Bg #webdesign
Door jkivit 24/02/10 (5 maanden geleden)
@fkoevoets: misschien interessant voor jullie http://www.netlash.com/blog/detail/html-naar-plain-text-omvormen