web-dev-qa-db-fra.com

Supprimer les balises HTML de la chaîne, y compris & nbsp en C #

Comment puis-je supprimer toutes les balises HTML, y compris & nbsp, à l’aide de regex en C #. Ma ficelle ressemble à

  "<div>hello</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>"
82
rampuriyaaa

Si vous ne pouvez pas utiliser une solution orientée analyseur HTML pour filtrer les balises, voici une regex simple.

string noHTML = Regex.Replace(inputHTML, @"<[^>]+>|&nbsp;", "").Trim();

Vous devriez idéalement faire une autre passe à travers un filtre regex qui prend en charge plusieurs espaces comme

string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " ");
189
Ravi Thapliyal

J'ai pris le code de @Ravi Thapliyal et créé une méthode: c'est simple et il est possible que tout ne soit pas nettoyé, mais jusqu'à présent, il fait ce que j'ai besoin de faire.

public static string ScrubHtml(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>|&nbsp;", "").Trim();
    var step2 = Regex.Replace(step1, @"\s{2,}", " ");
    return step2;
}
30
Don Rolling

J'utilise cette fonction depuis un moment. Enlève à peu près tout le code HTML désordonné que vous pouvez lui jeter et laisse le texte intact.

        private static readonly Regex _tags_ = new Regex(@"<[^>]+?>", RegexOptions.Multiline | RegexOptions.Compiled);

        //add characters that are should not be removed to this regex
        private static readonly Regex _notOkCharacter_ = new Regex(@"[^\w;&#@.:/\\?=|%!() -]", RegexOptions.Compiled);

        public static String UnHtml(String html)
        {
            html = HttpUtility.UrlDecode(html);
            html = HttpUtility.HtmlDecode(html);

            html = RemoveTag(html, "<!--", "-->");
            html = RemoveTag(html, "<script", "</script>");
            html = RemoveTag(html, "<style", "</style>");

            //replace matches of these regexes with space
            html = _tags_.Replace(html, " ");
            html = _notOkCharacter_.Replace(html, " ");
            html = SingleSpacedTrim(html);

            return html;
        }

        private static String RemoveTag(String html, String startTag, String endTag)
        {
            Boolean bAgain;
            do
            {
                bAgain = false;
                Int32 startTagPos = html.IndexOf(startTag, 0, StringComparison.CurrentCultureIgnoreCase);
                if (startTagPos < 0)
                    continue;
                Int32 endTagPos = html.IndexOf(endTag, startTagPos + 1, StringComparison.CurrentCultureIgnoreCase);
                if (endTagPos <= startTagPos)
                    continue;
                html = html.Remove(startTagPos, endTagPos - startTagPos + endTag.Length);
                bAgain = true;
            } while (bAgain);
            return html;
        }

        private static String SingleSpacedTrim(String inString)
        {
            StringBuilder sb = new StringBuilder();
            Boolean inBlanks = false;
            foreach (Char c in inString)
            {
                switch (c)
                {
                    case '\r':
                    case '\n':
                    case '\t':
                    case ' ':
                        if (!inBlanks)
                        {
                            inBlanks = true;
                            sb.Append(' ');
                        }   
                        continue;
                    default:
                        inBlanks = false;
                        sb.Append(c);
                        break;
                }
            }
            return sb.ToString().Trim();
        }
16
David S.
var noHtml = Regex.Replace(inputHTML, @"<[^>]*(>|$)|&nbsp;|&zwnj;|&raquo;|&laquo;", string.Empty).Trim();
4
MRP

J'ai utilisé le code de @RaviThapliyal & @Don Rolling, mais j'ai apporté une petite modification. Étant donné que nous remplaçons & nbsp par une chaîne vide mais que & nbsp devrait être remplacé par un espace, nous ajoutons une étape supplémentaire. Cela a fonctionné pour moi comme un charme.

public static string FormatString(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>", "").Trim();
    var step2 = Regex.Replace(step1, @"&nbsp;", " ");
    var step3 = Regex.Replace(step2, @"\s{2,}", " ");
    return step3;
}

Utilisé & nbps sans point-virgule car il était formaté par le débordement de pile.

1
Sabique A Khan

HTML est dans sa forme de base simplement XML. Vous pouvez analyser votre texte dans un objet XmlDocument et, sur l’élément racine, appeler InnerText pour extraire le texte. Cela effacera toutes les tages HTML sous quelque forme que ce soit et traitera également des caractères spéciaux comme lt; nbsp; tout en un.

0
nivs1978

cette:

(<.+?> | &nbsp;)

correspondra à n'importe quelle balise ou &nbsp;

string regex = @"(<.+?>|&nbsp;)";
var x = Regex.Replace(originalString, regex, "").Trim();

alors x = hello

0
Jonesopolis

Désinfecter un document HTML implique beaucoup de choses difficiles. Ce paquet peut-être d’aide: https://github.com/mganss/HtmlSanitizer

0
Ehsan88