6
votes

C # - Supprimer les espaces dans la source HTML entre les marquages?

Je travaille actuellement sur un programme qui me permet d'entrer du code source HTML dans une commande RichTextBox et supprime les espaces entre les balises entre les balises. Le seul problème est que je ne sais pas comment je peux différencier les espaces entre les balises et les espaces à l'intérieur des balises. Évidemment, enlever les espaces à l'intérieur des balises serait mauvais. Des idées sur la façon dont je peux dire la différence?

Exemple: (avant que l'espace blanc n'est supprimé) p> xxx pré>

exemple: (après l'espace blanc est supprimé) p>

<p>blahblahblah</p><p>blahblahblah</p>


3 commentaires

Dans quels espaces parlez-vous? Ceux entre les tags ou ceux dans une seule étiquette?


Les espaces blancs entre les balises. Exemple:

blahablahblah

blahablahblah l'espace entre les 2 paragraphes.


une solution alternative en utilisant HTML Agility Pack


7 Réponses :


1
votes

Je serais tenté d'utiliser une regex pour correspondre à n'importe quel espacion entre une balise de fin et la prochaine balise de début. La correspondance des motifs de regex vous éviterait d'avoir à écrire votre logique vous-même.


0 commentaires

1
votes

Techniquement parler, tous les espaces font partie de certains éléments HTML. L'élément le plus haut, c'est-à-dire le document, "possède" les espaces entre les nœuds distincts

dans votre exemple, par exemple.

Je pense donc que vous demandez si vous pouvez supprimer l'espace entre les nœuds au même niveau . Dans ce cas, vous devrez garder une trace du niveau d'imbrication de l'élément et de l'élément précédent. Par exemple, une série d'éléments qui se produisent dans le même élément , dans lequel vous pouvez détecter la fin d'un < / code> et le début du prochain et ignorez tous les espaces entre les sources.

Vous pourrez peut-être simplifier le processus et simplement ignorer tout blanc entre une balise de fermeture et la balise d'ouverture suivante (mais il peut y avoir Soyez quelques difficultés avec cette approche que je ne peux pas penser au sommet de ma tête).


0 commentaires

-1
votes

Je ne suis pas sûr du langage de programmation que vous utilisez. Mais vous pouvez faire comme suit dans C # en utilisant expression régulière . xxx

aussi, examinez-vous dans un autre thread de Stackoverflow peut être utile.

Utilisation d'une expression régulière pour couper HTML


0 commentaires

1
votes

Vous pouvez tenter d'utiliser une expression régulière pour dépouiller les espaces. Cependant, l'expression devrait être assez complexe de différencier entre l'ouverture et la fermeture des étiquettes et de gérer des étiquettes imbriquées.

Au lieu de cela, vous pouvez analyser l'entrée HTML à l'aide d'une bibliothèque comme le HTML Agility Pack puis reconstruire la chaîne HTML du modèle de document. Cela dépendra non seulement d'un espace blanc supplémentaire, il validera également le HTML (même automatiquement correctement les erreurs courantes).


0 commentaires

12
votes

la solution dans le lien que Rasik a envoyé ici c'est une solution pour Vous aussi

Regex.Replace(txtSource.Text,
            @"\s*(?<capture><(?<markUp>\w+)>.*<\/\k<markUp>>)\s*", "${capture}", RegexOptions.Singleline);


2 commentaires

Qu'en est-il du HTML suivant:

cette est un test . La sortie ne serait-elle pas:
cette est un test , ce qui rendrait comme suit: Test Thisisa?


Oui, en fait, pour ce test, il ne fonctionne pas que l'expression régulière doit être réglée pour détecter le marquage d'ouverture et les finitions et il sera plus compliqué



5
votes

J'utilise ce qui suit. En haut de ma tête, ce sont des lacunes ne manipulent pas les crochets dans les commentaires HTML et à l'intérieur de CDATA. Y a-t-il d'autres supports d'angle en HTML qui ne signifient pas des balises?

public static class HtmlHelper
{
    // positive look behind for ">", one or more whitespace (non-greedy), positive lookahead for "<"
    private static readonly Regex InsignificantHtmlWhitespace = new Regex(@"(?<=>)\s+?(?=<)");

    // Known not to handle HTML comments or CDATA correctly, which we don't use.
    public static string RemoveInsignificantHtmlWhiteSpace(string html)
    {
        return InsignificantHtmlWhitespace.Replace(html, String.Empty).Trim();
    }
}


1 commentaires

Absolument vraie regex est là 🤩



1
votes

Ma solution (similaire à la manière dont Linarize fonctionne dans le plug-in XML Tools dans NOTEPAD ++)

   internal static class CONST
   {
      internal static Regex linarize_regex = new Regex(@"[\r\n]+[\x20\t]*", RegexOptions.CultureInvariant | RegexOptions.Compiled);
      internal static Regex tag_linarize_regex = new Regex(@"(?<tag><[^>]*?>)[\r\n]+[\x20\t]*", RegexOptions.CultureInvariant | RegexOptions.Compiled);
   }
   internal static class UTILS
   {
      internal static string linarize_html(string html)
      {
         try
            {
               html = CONST.tag_linarize_regex.Replace(html, "${tag}");
               html = CONST.linarize_regex.Replace(html, " ");
               return html;
            }
            catch (Exception)
            {
               return html;
            }
      }
   }


0 commentaires