Как проверить, что строка не содержит HTML с использованием C #

голоса
20

Кто-нибудь есть простой и эффективный способ проверки того, что строка не содержит HTML? В принципе, я хочу, чтобы проверить, что некоторые поля содержат только простой текст. Я думал о поиске <характер, но которые могут быть легко использованы в виде обычного текста. Другой способ может быть, чтобы создать новый System.Xml.Linq.XElement с помощью:

XElement.Parse(<wrapper> + MyString + </wrapper>)

и убедитесь, что XElement не содержит дочерних элементов, но это, кажется, немного тяжеловес за то, что мне нужно.

Задан 15/10/2008 в 12:11
источник пользователем
На других языках...                            


7 ответов

голоса
45

Ниже будет соответствовать любому соответствующему набору тегов. т.е. <б> это </ b>

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

Ниже будет любой одиночный тег. т.е. <б> (он не должен быть закрыт).

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

После этого вы можете использовать его как так

bool hasTags = tagRegex.IsMatch(myString);
Ответил 15/10/2008 в 12:18
источник пользователем

голоса
9

Ну вот:

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

Это самый простой способ, так как элементы в квадратных скобках вряд ли произойдет естественным путем.

Ответил 15/10/2008 в 12:19
источник пользователем

голоса
2

Угловые скобки, не может быть вашей единственной проблемой. Другие символы могут быть потенциально опасны для инъекций сценария. Такие, как общий двойной дефис «-», который также может быть использован на инъекции SQL. А есть и другие.

На странице ASP.Net, если ValidateRequest = истина в machine.config, web.config или директиве страницы, пользователь получит страницу с ошибкой о том, «потенциально опасное значение Request.Form было обнаружено от клиента», если HTML теги или обнаруживаются различные другие потенциальные атаки скрипт-инъекции. Вы, вероятно, хотите, чтобы избежать этого и обеспечить более элегантный, менее пугающий опыт пользовательского интерфейса.

Вы можете проверить как для открытия и закрытия тегов <> с помощью регулярного выражения, и позволяют текст, если только один из них occcurs. Разрешить <или>, но не <с последующим текстом, а затем>, в таком порядке.

Вы можете позволить угловые скобки и HTMLEncode текста, чтобы сохранить их, когда данные сохраняются.

Ответил 15/10/2008 в 12:32
источник пользователем

голоса
21

Вы могли бы обеспечить простой текст, кодирующий вход с помощью HttpUtility.HtmlEncode .

На самом деле, в зависимости от того, насколько строги вы хотите проверить, чтобы быть, вы могли бы использовать его, чтобы определить, если строка содержит HTML:

bool containsHTML = (myString != HttpUtility.HtmlEncode(myString));
Ответил 15/10/2008 в 12:36
источник пользователем

голоса
6

Я просто попытался мое 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();

Я не уверен, если это пуленепробиваемое, но я думаю, что это достаточно хорошо для моей ситуации.

Ответил 15/10/2008 в 15:13
источник пользователем

голоса
0

Осторожно при использовании метода HttpUtility.HtmlEncode, упомянутого выше. Если вы проверяете текст с помощью специальных символов, но не HTML, он будет оценивать неправильно. Может быть, поэтому J с используется «... в зависимости от того, насколько строги вы хотите, чтобы проверить, чтобы быть ...»

Ответил 12/03/2011 в 05:33
источник пользователем

голоса
3

это также проверяет такие вещи, как <бр /> Самосовершенствование закрытых тегов с дополнительным пробелом. список не содержит новых тегов 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");
    }
}
Ответил 12/12/2014 в 15:25
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more