Question

J'ai un contenu HTML qui est entré par l'utilisateur via un éditeur WYSIWYG de sorte qu'il peut être presque rien (moins ceux qui ne censé être en dehors de la balise body, pas de soucis au sujet de « tête » ou doctype etc). Un exemple de ce contenu:

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

L'astuce est, je dois extraire 100 premiers caractères du texte uniquement (les balises HTML). Je dois aussi conserver les sauts de ligne et ne pas casser un mot.

Ainsi, la sortie de la ci-dessus sera quelque chose comme:

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

Il a 98 caractères et les sauts de ligne sont conservés. Ce que je peux obtenir à ce jour est de dépouiller les toutes les balises HTML en utilisant Regex:

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

TRIM, puis la longueur à l'aide Regex aussi bien avec:

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

Mon problème est, comment retenir le saut de ligne ?. Je reçois une sortie comme:

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

Remarquez les phrases joignant? Peut-être que quelqu'un peut me montrer d'autres façons de résoudre ce problème. Merci!

Informations supplémentaires : Mon but est de générer des synopsis de texte brut à partir d'un tas de contenu HTML. Je suppose que cela aidera à clarifier le problème.

Était-ce utile?

La solution 4

Eh bien, je dois fermer ce bien ne pas avoir la solution idéale. Étant donné que les balises HTML utilisées dans mon application sont très les communes (pas de tableaux, liste, etc.) avec peu ou pas de nidification, ce que je faisais est de preformat les fragments HTML avant de les enregistrer après l'entrée utilisateur.

  • Supprimer tous les sauts de ligne
  • Ajouter un préfixe de saut de ligne à toutes les étiquettes de blocs (par exemple div, p, h, h1 / 2/3/4, etc.)

Avant de les en extraire à afficher comme texte brut, utilisez regex pour enlever la balise html et de conserver la ligne de rupture. A peine toute la science des fusées, mais fonctionne pour moi.

Autres conseils

Je pense que je voudrais résoudre ce problème est de le regarder comme si elle était un simple navigateur. Créer une classe de base Tag, faire abstrait avec peut-être une propriété InnerHTML et un PrintElement de méthode virtuelle.

Ensuite, créer des classes pour chaque balise HTML que vous aimez et hériter de votre classe de base. A en juger par votre exemple, les balises vous intéressent le plus sont h1, p, a et h. Mettre en œuvre la méthode PrintElement telle qu'elle renvoie une chaîne qui imprime l'élément correctement sur la base du InnerHTML (comme la classe p PrintElement retournerait « \ n [InnerHTML] \ n »).

Ensuite, construire un analyseur qui analysera dans votre code HTML et déterminer l'objet pour créer et ajouter ces objets à une file d'attente (un arbre serait mieux, mais ne semble pas comme il est nécessaire pour vos besoins).

Enfin, passer par la file d'attente d'appeler la méthode PrintElement pour chaque élément.

Peut-être plus de travail que vous aviez prévu, mais il est une solution beaucoup plus robuste que la simple utilisation regex et si vous décidé de changer d'avis à l'avenir et que vous voulez montrer un style simple, il est juste une question de revenir en arrière et modifier votre méthodes PrintElement.

Pour info, le décapage html avec une expression régulière est ... plein de problèmes subtils. HTML Agility pack peut être plus robuste, mais souffre encore des mots saignant ensemble:

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

Une manière consisterait à enlever html en trois étapes:

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 </.*>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top