Dividere una stringa html in N parti

c# html-agility-pack htmltidy regex

Domanda

Qualcuno ha un esempio di spaccare una stringa html (proveniente da un piccolo editor di mce) e dividerlo in N parti usando C #?

Ho bisogno di dividere la corda in modo uniforme senza dividere le parole.

Stavo pensando di suddividere l'html e di usare HtmlAgilityPack per provare e correggere i tag danneggiati. Anche se non sono sicuro di come trovare il punto di divisione, come Idealmente dovrebbe essere basato puramente sul testo piuttosto che sull'html.

Qualcuno ha qualche idea su come andare su questo?

AGGIORNARE

Come richiesto, ecco un esempio di input e output desiderato.

INGRESSO:

<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>

OUTPUT (Quando diviso in 3 colonne):

<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>

AGGIORNAMENTO 2:

Ho appena avuto un gioco con Tidy HTML e sembra funzionare bene nel correggere i tag danneggiati, quindi questa può essere una buona opzione se riesco a trovare un modo per localizzare le pinte divise?

AGGIORNAMENTO 3

Usando un metodo simile a questa stringa Truncate su intere parole in .NET C # , ora sono riuscito a ottenere un elenco di parole in testo semplice che compongono ciascuna parte. Quindi, ad esempio usando Tidy HTML, ho una struttura XML valida per l'html e, dato questo elenco di parole, qualcuno ha avuto un'idea su quale sarebbe ora il modo migliore per dividerlo?

AGGIORNAMENTO 4

Qualcuno può vedere un problema con l'utilizzo di una regex per trovare gli indici con l'HTML nel modo seguente:

Data la stringa di testo semplice "sit amet, consectetur", sostituisci tutti gli spazi con la regex "(\ s | <(. | \ N) +?>) *", In teoria trovando quella stringa con qualsiasi combinazione di spazi e / o tag

Potrei quindi usare Tidy HTML per correggere i tag html danneggiati?

Grazie molto

opaco

Risposta accettata

Una soluzione proposta

Amico, questa è una mia maledizione ! A quanto pare non riesco ad allontanarmi da un problema senza spendere troppo tempo, incluso un periodo di tempo irragionevole .

Ci ho pensato. Ho pensato a HTML Tidy, e forse avrebbe funzionato, ma ho avuto dei problemi a girarmela intorno.

Quindi, ho scritto la mia soluzione.

Ho provato questo sul tuo input e su qualche altro input che ho buttato insieme. Sembra funzionare abbastanza bene. Sicuramente ci sono dei buchi, ma potrebbe fornirti un punto di partenza.

Ad ogni modo, il mio approccio era questo:

  1. Incapsula la nozione di una singola parola in un documento HTML usando una classe che include informazioni sulla posizione di quella parola nella gerarchia del documento HTML, fino a un dato "top". Questo ho implementato nella classe HtmlWord seguito.
  2. Crea una classe che sia in grado di scrivere una singola riga composta da queste parole HTML sopra, in modo tale che i tag elemento iniziale e finale vengano aggiunti nelle posizioni appropriate. Questo ho implementato nella classe HtmlLine qui sotto.
  3. Scrivi alcuni metodi di estensione per rendere queste classi immediatamente e intuitivamente accessibili direttamente da un oggetto HtmlAgilityPack.HtmlNode . Questi ho implementato nella classe HtmlHelper seguito.

Sono pazzo di fare tutto questo? Probabilmente sì. Ma, sai, se non riesci a capire in nessun altro modo, puoi fare un tentativo.

Ecco come funziona con il tuo esempio di input:

var document = new HtmlDocument();
document.LoadHtml("<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>");

var nodeToSplit = document.DocumentNode.SelectSingleNode("p");
var lines = nodeToSplit.SplitIntoLines(3);

foreach (var line in lines)
    Console.WriteLine(line.ToString());

Produzione:

var document = new HtmlDocument();
document.LoadHtml("<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>");

var nodeToSplit = document.DocumentNode.SelectSingleNode("p");
var lines = nodeToSplit.SplitIntoLines(3);

foreach (var line in lines)
    Console.WriteLine(line.ToString());

E ora per il codice:

HtmlWord class

var document = new HtmlDocument();
document.LoadHtml("<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>");

var nodeToSplit = document.DocumentNode.SelectSingleNode("p");
var lines = nodeToSplit.SplitIntoLines(3);

foreach (var line in lines)
    Console.WriteLine(line.ToString());

Classe HtmlLine

var document = new HtmlDocument();
document.LoadHtml("<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>");

var nodeToSplit = document.DocumentNode.SelectSingleNode("p");
var lines = nodeToSplit.SplitIntoLines(3);

foreach (var line in lines)
    Console.WriteLine(line.ToString());

HtmlHelper static class

var document = new HtmlDocument();
document.LoadHtml("<p><strong>Lorem ipsum dolor sit amet, <em>consectetur adipiscing</em></strong> elit.</p>");

var nodeToSplit = document.DocumentNode.SelectSingleNode("p");
var lines = nodeToSplit.SplitIntoLines(3);

foreach (var line in lines)
    Console.WriteLine(line.ToString());

Conclusione

Giusto per ribadire: questa è una soluzione gettata insieme; Sono sicuro che abbia problemi. La presento solo come punto di partenza da prendere in considerazione - di nuovo, se non sei in grado di ottenere il comportamento che desideri attraverso altri mezzi.


Risposta popolare

Questo suggerimento è solo un trucco - si spera che ci sia un modo migliore.

Fondamentalmente, vuoi prendere una porzione di testo formattato in HTML e dividerlo in parti più piccole che conservano ancora il font ecc. Dell'originale. Penso che potresti caricare l'HTML originale in un controllo RTF o in un oggetto Word, dividerlo in parti che mantengono la formattazione e quindi produrre i pezzi come HTML separato.

Potrebbe anche esserci un modo per usare HtmlAgilityPack in questo modo, se fornisce un modo semplice per estrarre testo con informazioni di formattazione dall'HTML originale.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché