Haskell:从字符串中删除HTML字符实体

3
我想处理一个包含HTML字符实体(如 等)的字符串,并将它们替换为相应的字符。我通过Twitter的API获取数据,其中文本包含这些实体。请问是否有现成的库可以实现这个功能?
谢谢您的帮助!

您是否考虑更改已接受的答案(该答案使用了已弃用的库,可能会错过许多实体)? - Johannes Gerer
3个回答

3

我使用了 tagsoup 包中的函数构建下列函数。它可以处理来自 HTML5 标准的所有命名实体和数字实体(超过 2000 种,请参阅列表)。

import   qualified          Text.HTML.TagSoup as TS

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

StringLikeString、惰性和严格的 ByteStringText 实例。

未知实体将保持不变。如果你想要关于未知实体的警告,请使用:

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

2

1
请注意,它不支持所有的HTML实体,只支持其中的一部分 - 并且它会“吞噬”任何它不认识的实体,也就是说,它们将消失。 - Orbling
1
太好了,非常感谢!我可以问问你是怎么找到这个的吗?我发誓我进行了相当彻底的搜索(谷歌,Hoogle,Hackage),但都没有找到什么。 - Hojdra
我在谷歌上搜索了“haskell entity decode”,它是第二个条目。只需要知道你想要一个“实体解码器”,并且了解Haskell的包库,当然你已经知道了。 :-) - Orbling
我想重新提出这个问题,寻求一个更一般的答案,以便转义命名的HTML实体。 - vicvicvic
1
@HaskellElephant: 我在haskell初学者邮件列表上看到了一条消息(http://www.haskell.org/pipermail/beginners/2013-April/011759.html),询问在哪些情况下被弃用。它提到了[`Text.XML.decodeHtmlEntities`](http://hackage.haskell.org/packages/archive/xml-conduit/1.0.3.1/doc/html/Text-XML-Stream-Parse.html#t:DecodeEntities)例程,该例程是`xml-conduit`包的一部分。虽然说它并没有起作用,但是它应该可以处理基本实体的解码。 - Orbling
显示剩余5条评论

-7

你好,请尝试下面的代码,它会正常工作

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

2
我建议你查一下有多少可能的实体:http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references 我认为正则表达式不是解决问题的方法。此外,你的解决方案不是用Haskell编写的。 - andsens
虽然这样可能行得通,但自己为这样的任务编写函数并不是一个好主意。一个库总是会包含更少的错误、失误等。 - Willem Van Onsem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接