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> exemple: (après l'espace blanc est supprimé) p> <p>blahblahblah</p><p>blahblahblah</p>
7 Réponses :
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. P>
Techniquement parler, tous les espaces em> 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 code> dans votre exemple, par exemple. P>
Je pense donc que vous demandez si vous pouvez supprimer l'espace entre les nœuds au même niveau em>. 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 Vous pourrez peut-être simplifier le processus et simplement ignorer tout blanc entre une balise de fermeture Je ne suis pas sûr du langage de programmation que vous utilisez. Mais vous pouvez faire comme suit dans C # fort> en utilisant aussi, examinez-vous dans un autre thread de Stackoverflow peut être utile. p> Utilisation d'une expression régulière pour couper HTML P > p> 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. P>
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). P> la solution dans le lien que Rasik a envoyé ici c'est une solution pour Vous aussi
Qu'en est-il du HTML suivant:
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é 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?
Absolument vraie regex est là 🤩 Ma solution (similaire à la manière dont Linarize fonctionne dans le plug-in XML Tools dans NOTEPAD ++)
code> qui se produisent dans le même élément
code>, dans lequel vous pouvez détecter la fin d'un td> < / code> et le début du prochain
code> et ignorez tous les espaces entre les sources. P>
x> code> et la balise d'ouverture suivante
votes
votes
votes
Regex.Replace(txtSource.Text,
@"\s*(?<capture><(?<markUp>\w+)>.*<\/\k<markUp>>)\s*", "${capture}", RegexOptions.Singleline);
votes
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();
}
}
votes
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;
}
}
}
Dans quels espaces parlez-vous? Ceux entre les tags ou ceux dans une seule étiquette?
Les espaces blancs entre les balises. Exemple:
blahablahblah p>
blahablahblah p> l'espace entre les 2 paragraphes.
une solution alternative en utilisant HTML Agility Pack