2017-09-05 150 views
1

我试图找到一种方法来正确地分割它,但直到现在我遇到了很多问题。使用string.split/string.substring, string.indexof, string.replace等。将富文本分割为包含富文本代码的列表

这里是一个样本字符串,需要分成一个列表。

We are <b><i>very</i></b><b>a</b>mused!\nThank you. 

,结果列表中应该按以下顺序:

0: We 
1: are 
2: <b> 
3: <i> 
4: very 
5: </i> 
6: </b> 
7: <b> 
8: a 
9: </b> 
10: mused! 
11: \n 
12: Thank 
13: you. 

那么什么,我试图做的是这样的:

splitStart = baseString.Value.Split(' '); 
foreach (string part in splitStart) 
{ 
    if (part.Contains("<")) 
    { 
     // get the parts <b> <i> <size> <color> </b> </i> </size> </color> \n 
     textlist.Add(part); // add each part to list 
    } 
    else 
    { 
     textlist.Add(part); 
     Debug.Log(part); 
    } 
} 

我试着像

东西
contains("<n>") 
replace "<n>" "" and add "<n>" to array 

但可以打破顺序CE。

编辑: 我忘了说,这是C#

+0

似乎是定义解析器的相当方便的情况。首先要明确这些规则。如果你根据一个空格'“”分割它,这些标签看起来似乎全部融入到了一个链中。然后'<'需要找到一个匹配的'>'把子字符串拉出到最终列表中。然后'!'和'\ nT'需要再次进行特殊处理。 – nullpointer

回答

0

我想你需要的字符一些预处理使用一些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,

+0

嗨,对不起,我忘了说,这是为C#。 此外,结果必须如我的样本所示 –