如何使用C#验证字符串是否包含HTML

时间:2008-10-15 13:11:07

标签: c# html validation

有没有人有一种简单有效的方法来检查字符串是否包含HTML?基本上,我想检查某些字段是否只包含纯文本。我想过寻找<字符,但可以很容易地用于纯文本。另一种方法可能是使用:

创建一个新的System.Xml.Linq.XElement
XElement.Parse("<wrapper>" + MyString + "</wrapper>")

并检查XElement是否包含子元素,但这似乎对我需要的东西有点重要。

7 个答案:

答案 0 :(得分:48)

以下内容将匹配任何匹配的标记集。即&lt; b&gt;这&lt; / b&gt;

Regex tagRegex = new Regex(@"<\s*([^ >]+)[^>]*>.*?<\s*/\s*\1\s*>");

以下内容将匹配任何单个标记。即&lt; b&gt; (它不必关闭)。

Regex tagRegex = new Regex(@"<[^>]+>");

然后您可以像这样使用它

bool hasTags = tagRegex.IsMatch(myString);

答案 1 :(得分:21)

您可以使用HttpUtility.HtmlEncode对输入进行编码来确保纯文本。

实际上,根据您希望检查的严格程度,您可以使用它来确定字符串是否包含HTML:

bool containsHTML = (myString != HttpUtility.HtmlEncode(myString));

答案 2 :(得分:9)

你走了:

using System.Text.RegularExpressions;
private bool ContainsHTML(string CheckString)
{
  return Regex.IsMatch(CheckString, "<(.|\n)*?>");
}

这是最简单的方法,因为括号中的项目不太可能自然发生。

答案 3 :(得分:7)

我刚试过我的XElement.Parse解决方案。我在字符串类上创建了一个扩展方法,因此我可以轻松地重用代码:

public static bool ContainsXHTML(this string input)
{
    try
    {
        XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>");
        return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text);
    }
    catch (XmlException ex)
    {
        return true;
    }
}

我发现的一个问题是纯文本符号和少于字符会导致XmlException并指示该字段包含HTML(这是错误的)。要解决此问题,首先传入的输入字符串需要具有&符号,并且少于字符转换为其等效的XHTML实体。我写了另一种扩展方法:

public static string ConvertXHTMLEntities(this string input)
{
    // Convert all ampersands to the ampersand entity.
    string output = input;
    output = output.Replace("&amp;", "amp_token");
    output = output.Replace("&", "&amp;");
    output = output.Replace("amp_token", "&amp;");

    // Convert less than to the less than entity (without messing up tags).
    output = output.Replace("< ", "&lt; ");
    return output;
}

现在我可以使用用户提交的字符串并使用以下代码检查它是否包含HTML:

bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML();

我不确定这是不是防弹,但我认为这对我的情况来说已经足够了。

答案 4 :(得分:3)

这也会检查像&lt; br /&gt;带有可选空格的自封闭标签。该列表不包含新的html5标签。

internal static class HtmlExts
{
    public static bool containsHtmlTag(this string text, string tag)
    {
        var pattern = @"<\s*" + tag + @"\s*\/?>";
        return Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase);
    }

    public static bool containsHtmlTags(this string text, string tags)
    {
        var ba = tags.Split('|').Select(x => new {tag = x, hastag = text.containsHtmlTag(x)}).Where(x => x.hastag);

        return ba.Count() > 0;
    }

    public static bool containsHtmlTags(this string text)
    {
        return
            text.containsHtmlTags(
                "a|abbr|acronym|address|area|b|base|bdo|big|blockquote|body|br|button|caption|cite|code|col|colgroup|dd|del|dfn|div|dl|DOCTYPE|dt|em|fieldset|form|h1|h2|h3|h4|h5|h6|head|html|hr|i|img|input|ins|kbd|label|legend|li|link|map|meta|noscript|object|ol|optgroup|option|p|param|pre|q|samp|script|select|small|span|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|ul|var");
    }
}

答案 5 :(得分:2)

尖括号可能不是您唯一的挑战。其他字符也可能是有害的脚本注入。比如常用的双连字符“ - ”,它也可以用在SQL注入中。还有其他人。

在ASP.Net页面上,如果在machine.config,web.config或page指令中validateRequest = true,则用户将收到一个错误页面,指出“从客户端检测到潜在危险的Request.Form值”,如果检测到HTML标记或各种其他潜在的脚本注入攻击。您可能希望避免这种情况,并提供更优雅,更不可怕的UI体验。

您可以测试开始和结束标记&lt;&gt;使用正则表达式,如果只有其中一个出现,则允许该文本。允许&lt;或&gt;,但不是&lt;接下来是一些文本,然后是>,按顺序。

您可以允许尖括号和HtmlEncode文本在数据持久化时保留它们。

答案 6 :(得分:0)

使用上面提到的HttpUtility.HtmlEncode方法时要小心。如果要检查某些带有特殊字符但不包含HTML的文本,则会进行错误的评估。也许这就是为什么J c使用“......取决于你想要检查的严格程度......”