2017-09-05 2 views
1

Ich versuche, einen Weg zu finden, dies richtig zu trennen, aber bis jetzt stoße ich auf viele Probleme.Split Rich Text in eine Liste mit dem Richtext-Code

mit string.split/string.substring, string.indexof, string.replace und so weiter.

Hier ist eine Beispielzeichenfolge, die in eine Liste aufgeteilt werden muss.

wie

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); 
    } 
} 

ich Dinge ausprobiert :

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

und das Ergebnis in der Liste in dieser Reihenfolge sein sollte:

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. 
dies zu tun ist

Also, was ich versuche,

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

aber das kann die Sequenz brechen ce.

Edit: Ich habe vergessen zu sagen, dass dies für C# ist

+0

scheint wie eine sehr praktische Situation der Definition eines Parsers. Die Regeln müssen dafür in erster Linie klar sein. Wenn Sie es basierend auf einem Leerzeichen "" "trennen, erscheinen die Tags in einer einzigen Kette für mich. Dann muss '<' ein passendes '>' finden, um den Teilstring in die endgültige Liste zu ziehen. Dann '' '' '' und das '\ nT' benötigt erneut eine spezielle Handhabung. – nullpointer

Antwort

0

Ich glaube, Sie brauchen eine Vorbearbeitung von Zeichen einige HTML-Parser wie jsoup oder Baumstruktur-Algorithmus.

Es ist eine Option, um diesen Fall mit Jsoup-Bibliothek zu machen.

1. Java-Version

Zuerst Wortliste aus den HTML-Tags vorzubereiten.

Dann durchlaufen Sie den HTML-Inhalt mit Jsoups NodeVisitor-Klasse.

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) { 

       } 
      } 
     ); 

Schließlich ist der Code wie folgt.

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.")); 
    } 
} 

Der Ausgang muss aussehen wie seine

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

2. C# Version

Nun, Der Quellcode von C# Version ist ein litte bisschen anders aber die gleiche Prozess (mit ein wenig Änderung benötigt).

Dies ist meine NodeVisitor-Version des Codes.

Zuerst analysieren Sie den HTML-Inhalt.

Document doc = NSoupClient.Parse(str); 

Zweitens, wählen Sie den ursprünglichen Satz aus 'Körper' Tag.

doc.Select("body").Traverse(new TestNodeVisitor(wordList)); 

Der vollständige Code wie folgt.

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); 
      } 

     } 
    } 
} 

Die Ausgabe sollte auch seine

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

Sie die NSoup Bibliothek, die ich zu diesem Zeitpunkt verwendet finden (eigentlich keine offizielle Version 0.8.0) von den site.

Die offizielle NSoup-Site ist here, aber keine Besucherschnittstelle.

Dann können Sie Ihre eigene Methode verwenden, um Code abzuschließen.

Ich muss Ihnen sagen, dies ist nur eine Option für Ihr Ziel.

Regard,

+0

Hallo, sorry, ich habe vergessen zu sagen, dass dies für C# ist. Auch das Ergebnis muss wie in meiner Probe gezeigt sein –