Domanda

Ho un contenuto HTML che viene immesso dall'utente tramite un editor RTF in modo che possa essere quasi qualsiasi cosa (meno quelli che non doveva essere al di fuori del tag body, nessuna preoccupazione per "testa" o doctype, ecc). Un esempio di questo contenuto:

<h1>Header 1</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />
<h1>Header 2</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />

Il trucco è, ho bisogno di estrarre primi 100 caratteri di solo il testo (tag HTML rimossi). Ho anche bisogno di mantenere le interruzioni di riga e non rompere qualsiasi parola.

Quindi, l'uscita per il sopra sarà qualcosa del tipo:

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

Si dispone di 98 caratteri, interruzioni di riga vengono conservati. Che cosa posso ottenere finora è mettere a nudo l'tutti i tag HTML utilizzando Regex:

Regex.Replace(htmlStr, "<[^>]*>", "")

Poi tagliare la lunghezza utilizzando Regex anche con:

Regex.Match(textStr, @"^.{1,100}\b").Value

Il mio problema è, come mantenere l'interruzione di riga ?. Ottengo un output come:

Header 1
Some text hereSome more text here
A link here
Header 2
Some text hereSome more text

Si notino le frasi di unione? Forse qualcuno mi può mostrare alcuni altri modi per risolvere questo problema. Grazie!

Ulteriori informazioni : Il mio scopo è quello di generare semplice sinossi del testo da un gruppo di contenuto HTML. Immagino che questo vi aiuterà a chiarire il problema.

È stato utile?

Soluzione 4

Bene, ho bisogno di chiudere questo pur non avendo la soluzione ideale. Dal momento che i tag HTML utilizzati nella mia app sono quelle molto comuni (tavoli, lista ecc) con poca o nessuna nidificazione, quello che ho fatto è quello di preformat i frammenti HTML prima di salvarli dopo l'input dell'utente.

  • Rimuovi tutte le interruzioni di riga
  • Aggiungi un prefisso un'interruzione di linea a tutti i tag di blocco (ad esempio div, p, hr, h1 / 2/3/4 ecc)

Prima di loro ho estratto fuori per essere visualizzati come testo semplice, utilizzare regex per rimuovere il tag HTML e mantenere la linea-break. Quasi nessuna scienza missilistica, ma funziona per me.

Altri suggerimenti

Credo che come vorrei risolvere questo è quello di guardare come se si trattasse di un semplice browser. Creare una classe base Tag, renderlo astratto con forse una proprietà InnerHTML e un metodo PrintElement virtuale.

In seguito, creare classi per ogni tag HTML che ti stanno a cuore e ereditano dalla classe base. A giudicare dal vostro esempio, i tag a cui tieni di più di sono H1, P, A, e HR. Implementare il metodo PrintElement tale che restituisce una stringa che stampa l'elemento correttamente sulla base del InnerHTML (come la classe p PrintElement sarebbe tornato '\ n [InnerHTML] n \').

Avanti, costruire un parser che analizzerà attraverso il vostro HTML e determinare quale oggetto per creare e quindi aggiungere gli oggetti ad una coda (un albero sarebbe meglio, ma non sembra che sia necessario per i vostri scopi).

Infine, passare attraverso la coda di una chiamata al metodo PrintElement per ogni elemento.

Può essere più lavoro di quanto aveva previsto, ma è una soluzione molto più robusto di quanto semplicemente utilizzando espressioni regolari e si dovrebbe deciso di cambiare idea in futuro e vuole mostrare uno stile semplice è solo una questione di andare indietro e modificare il metodi PrintElement.

Per info, strippaggio html con una regex è ... pieno di problemi sottili. Il HTML Agility pacchetto può essere più robusto, ma soffre ancora dalle parole sanguinamento insieme:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;

Un modo potrebbe essere quello di spogliare html in tre fasi:

Regex.Replace(htmlStr, "<[^/>]*>", "") // don't strip </.*>
Regex.Replace(htmlStr, "</p>", "\r\n") // all paragraph ends are replaced w/ new line
Regex.Replace(htmlStr, "<[^>]*>", "") // replace remaining </.*>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top