2010-11-18 4 views
4

Ich bin auf der Suche nach einer Zeichenfolge mit HTML-Zeichen Entitäten wie   etc und ersetzen sie durch die literalen Zeichenfolgen. Ich bekomme Daten über twitter's API und der Text enthält diese Entitäten. Wer weiß von einer vorhandenen Bibliothek, die das tut?Haskell: Entfernen Sie HTML-Zeichen-Entitäten in einer Zeichenfolge

Danke für Ihre Hilfe!

+0

Danke für die Bearbeitung Tom, rutschte mir durch den Kopf. – Hojdra

+0

Möchten Sie die akzeptierte Antwort ändern (was eine veraltete Bibliothek ist und viele Entitäten vermissen lässt)? –

Antwort

3

Das Web.Encodings Paket auf Hackage sieht vielversprechend aus (die decodeHtml-Funktion):

http://hackage.haskell.org/packages/archive/web-encodings/0.3.0.2/doc/html/Web-Encodings.html

+1

Beachten Sie, dass es nicht alle HTML-Entitäten unterstützt, nur eine Teilmenge - und es "schluckt" alle, die es nicht kennt, dh. Sie werden verschwinden. – Orbling

+1

Das ist perfekt, vielen Dank! Darf ich fragen, wie Sie das gefunden haben? Ich schwöre, ich habe ziemlich gründlich gesucht (Google, Hoogle, Hack) und konnte nichts finden. – Hojdra

+0

Ich suchte google nach "haskell entity decode" und es war der zweite Eintrag. Nur eine Frage der Erkenntnis, dass Sie einen "Entity-Decoder" wollten und sich der Haskell-Paketbibliothek bewusst waren, die Sie natürlich schon waren. :-) – Orbling

-6

Hallo den Code unten versuchen, es

labelTR = labelTR.replace(/(?: |")/g,''); 
+2

Ich schlage vor, Sie suchen, wie viele mögliche Entitäten gibt es: http: //en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references Ich glaube nicht, dass ein regulärer Ausdruck der richtige Weg ist. Außerdem ist Ihre Lösung nicht in haskell. – andsens

+0

Obwohl das funktionieren könnte, ist das Schreiben einer Funktion für solche Aufgaben selbst keine gute Idee. Eine Bibliothek enthält immer weniger Bugs, Fehler usw. –

2
ausarbeitet

baute ich die folgende Funktion mit Funktionen aus dem Paket tagsoup. Es behandelt alle benannten und numerischen Entitäten aus dem HTML5-Standard (mehr als 2000, see the list).

import qualified   Text.HTML.TagSoup as TS 

decodeHTMLentities :: (StringLike str, Show str) => str -> str 
decodeHTMLentities s = TS.fromTagText $ head $ TS.parseTags s 

StringLike hat Instanzen für String, Faul und Strenge ByteString und Text.

Unbekannte Enites bleiben intakt. Wenn Sie eine Warnung über unbekannte Entitäten verwenden möchten:

> parseTagsOptions parseOptions{optTagWarning=True} "&asdasd;" 
[TagText "&asdasd;",TagWarning "Unknown entity: asdasd"]