Frage

Ich habe einen HTML-Inhalte, die durch den Benutzer über einen rich Editor eingegeben wird, so dass es fast alles sein kann (weniger diejenigen, die nicht außerhalb des Körpers Tag sein sollte, keine Sorgen über „Kopf“ oder Doctype usw.). Ein Beispiel für diesen Inhalt:

<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 />

Der Trick ist, ich brauche ersten 100 Zeichen des Textes extrahieren nur (HTML-Tags entfernt). Ich brauche auch die Zeilenumbrüche zu halten und kein Wort zu brechen.

So ist der Ausgang für das oben angeführte wird so etwas wie:

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

Es hat 98 Zeichen und Zeilenumbrüche beibehalten werden. Was kann ich bisher erreichen ist, die alle HTML-Tags Regex abzustreifen:

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

schneiden Sie dann die Länge mit Regex als auch mit:

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

Mein Problem ist, wie man den Zeilenumbruch beibehalten ?. Ich erhalte eine Ausgabe wie:

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

Beachten Sie die Verbindungssätze? Vielleicht kann mir jemand zeigen einige andere Möglichkeiten, dieses Problem zu lösen. Dank!

Zusätzliche Informationen : Mein Ziel ist es Klartext Synopse von einer Reihe von HTML-Inhalten zu generieren. Denke, das wird helfen, die dieses Problem zu klären.

War es hilfreich?

Lösung 4

Nun, ich brauche diese zu schließen, wenn auch nicht die ideale Lösung ist. Da die HTML-Tags in meiner Anwendung verwendet werden, sind sehr häufig diejenigen (keine Tabellen, Liste usw.) mit wenig oder gar keiner Verschachtelung, was ich tat, ist die HTML-Fragmente vorformatieren, bevor ich sie nach Benutzereingaben speichern.

  • Entfernen alle Zeilenumbrüche
  • einen Zeilenumbruch Präfix für alle Block-Tags hinzufügen (z div, p, h, h1 / 2/3/4 usw.)

Bevor ich sie extrahieren als Klartext angezeigt werden, verwenden Sie regex die HTML-Tag zu entfernen und den Zeilenumbruch behalten. Kaum eine Rakete Wissenschaft, sondern arbeitet für mich.

Andere Tipps

Ich denke, wie ich dieses Problem lösen, es zu betrachten ist, als ob es ein einfacher Browser war. Erstellen Sie eine Basis Tag Klasse, machen es zu abstrakt mit vielleicht einem Innerhtml-Eigenschaft und eine virtuelle Methode PrintElement.

Als Nächstes erstellen Klassen für jeden HTML-Tag, die Sie wichtig ist und von Ihrer Basisklasse erbt. Geht man von Ihrem Beispiel die Tags, die Sie am meisten interessieren uns sind h1, p, a und h. Implementieren Sie die PrintElement Methode, so dass sie einen String zurückgibt, die das Element richtig auf dem Innerhtml basierend druckt (wie die p class' PrintElement zurückkehren würde ‚\ n [Innerhtml] \ n‘).

Als nächstes bauen einen Parser, die durch Ihre HTML analysieren werden und bestimmen, welche erstellen Objekt und dann diese Objekte in eine Warteschlange hinzuzufügen (ein Baum besser sein würde, aber sieht nicht wie es für Ihre Zwecke erforderlich ist).

Schließlich Warteschlange geht durch die PrintElement Methode für jedes Element aufgerufen wird.

Kann mehr Arbeit, als Sie geplant hatten, aber es ist eine weit robustere Lösung als einfach regex und sollen Sie sich entschieden, Ihren Geist in der Zukunft zu ändern und wollen einfach Styling zeigen, es ist nur eine Frage, zurückzugehen und Ihre Modifikation PrintElement Methoden.

Für Informationen, mit einem regex html Strippen ist ... voller subtiler Probleme. Die HTML Agility Pack- kann robuster sein, aber leidet immer noch unter den Worten Blutungen zusammen:

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

Eine Möglichkeit könnte html in drei Schritten abzustreifen sein:

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 </.*>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top