2017-09-05 56 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#。 此外,結果必須如我的樣本所示 –