我想你需要的字符一些预处理使用一些HTML解析器像jsoup或树结构算法。
这是用Jsoup库创建这种情况的一个选项。
1. Java版本
首先,准备从HTML标签的单词列表。
final List<String> wordList = new ArrayList<String>();
然后,使用Jsoup的NodeVisitor类遍历html内容。
doc.body().traverse(
new NodeVisitor(){
@Override
public void head(Node arg0, int arg1) {
if(arg1 == 1)
{
String value = arg0.outerHtml();
if(!wordList.contains(value))
wordList.add(arg0.outerHtml());
}
}
@Override
public void tail(Node arg0, int arg1) {
}
}
);
最后,代码如下。
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;
import org.jsoup.select.NodeVisitor;
public class HtmlTest {
public static String parseHtml(String str) {
org.jsoup.nodes.Document doc = Jsoup.parse(str);
final List<String> wordList = new ArrayList<String>();
doc.body().traverse(
new NodeVisitor(){
@Override
public void head(Node arg0, int arg1) {
if(arg1 == 1)
{
//String value = Jsoup.parse(arg0.outerHtml()).text();
String value = arg0.outerHtml();
if(!wordList.contains(value))
wordList.add(arg0.outerHtml());
}
}
@Override
public void tail(Node arg0, int arg1) {
}
}
);
for(String word: wordList)
{
System.out.println(word);
}
return "";
}
public static void main(String[] args)
{
System.out.println(parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you."));
}
}
输出必须看起来像,
We are
<b><i>very</i></b>
<b>a</b>
mused! Thank you.
2. C#版本
嗯,C#版本的源代码是豆蔻位不同 但相同的过程(需要稍作更改)。
这是我的NodeVisitor版本的代码。
首先解析html内容。
Document doc = NSoupClient.Parse(str);
二,从'body'标签中选择原文。
doc.Select("body").Traverse(new TestNodeVisitor(wordList));
完整的代码如下。
using NSoup;
using NSoup.Nodes;
using NSoup.Select;
using System;
using System.Collections.Generic;
using System.IO;
namespace NSoupTest
{
class Program
{
private class TestNodeVisitor : NodeVisitor
{
List<String> wordList;
public TestNodeVisitor(List<String> wordList)
{
this.wordList = wordList;
}
public void Head(Node node, int depth)
{
if(depth == 1)
{
String value = node.OuterHtml();
if(!wordList.Contains(value))
wordList.Add(value);
}
}
public void Tail(Node node, int depth)
{
}
}
public static String parseHtml(String str) {
Document doc = NSoupClient.Parse(str);
List<String> wordList
= new List<String>();
doc.Select("body").Traverse(new TestNodeVisitor(wordList));
foreach (String word in wordList)
{
Console.WriteLine(word);
}
return "";
}
static void Main(string[] args)
{
try
{
parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you.");
}
catch (FileNotFoundException fe) {
Console.WriteLine(fe.Message);
}
}
}
}
输出也应该是
We are
<b><i>very</i></b>
<b>a</b>
mused! Thank you.
你可以找到我在这个时候(其实,不是一个正式版本0.8.0)从site使用的NSoup库。
官方NSoup网站是here但没有访客界面。
然后,您可以使用自己的方法来完成代码。
我必须告诉你,这只是你的目标的一个选择。
Regard,
似乎是定义解析器的相当方便的情况。首先要明确这些规则。如果你根据一个空格'“”分割它,这些标签看起来似乎全部融入到了一个链中。然后'<'需要找到一个匹配的'>'把子字符串拉出到最终列表中。然后'!'和'\ nT'需要再次进行特殊处理。 – nullpointer