有几个不同的方法来去除HTML tags从NSString在Cocoa.
一种方法是将字符串渲染为a NSAttributedString然后抓取渲染的文本.
另一种方法是使用NSXMLDocument's- objectByApplyingXSLTString方法来应用XSLT执行它的变换.
不幸的是,iPhone不支持NSAttributedString或NSXMLDocument.有太多的边缘情况和格式错误的HTML文档让我觉得使用正则表达式或NSScanner.有人有解决方案吗?
一个建议是简单地查找开始和结束标记字符,除非非常简单的情况,否则此方法不起作用.
例如,这些案例(来自同一主题的Perl Cookbook章节)会打破这种方法:
<IMG SRC = "foo.gif" ALT = "A > B">
<!-- <A comment> -->
<script>if (a<b && a>c)</script>
<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>
Run Code Online (Sandbox Code Playgroud) 在 Swift 中,我使用 Decoding HTML NSAttributedString,如下所示:
let encodedString = "Ph\xe1\xba\xa3i c\xc3\xb4ng nh\xe1\xba\xadn r\xe1\xba\xb1ng k\xe1\xbb\x83 t\xe1\xbb\xab l\xc3\xbac \xc3\xb4ng Th\xc4\x83ng\xc2\xa0l\xc3\xa0m b\xe1\xbb\x99 tr\xc6\xb0\xe1\xbb\x9fng"\nlet encodedData = encodedString.dataUsingEncoding(NSUTF8StringEncoding)\nlet attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]\nlet attributedString = NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil, error: nil) \nlet decodedString = attributedString.string\nprintln(decodedString)\nRun Code Online (Sandbox Code Playgroud)\n\n但结果是这样的:
\n\n\n\n\nPh\xc3\xa1\xc2\xba\xc2\xa3i c\xc3\x83\xc2\xb4ng nh\xc3\xa1\xc2\xba\xc2\xadn r\xc3\xa1\xc2\xba\xc2\xb1ng k\ xc3\xa1\xc2\xbb\xc6\x92 t\xc3\xa1\xc2\xbb\xc2\xab l\xc3\x83\xc2\xbac \xc3\x83\xc2\xb4ng Th\xc3\x84\xc6\x92ng \xc3\x82\xc2\xa0l\xc3\x83\xc2\xa0m b\xc3\xa1\xc2\xbb\xe2\x84\xa2\n tr\xc3\x86\xc2\xb0\xc3\xa1\xc2\xbb \xc5\xb8ng
\n
真实结果一定与encodedString
这个方法有什么问题吗?
\n