Ben*_*lls 26 html c# validation
有没有人有一种简单有效的方法来检查字符串是否包含HTML?基本上,我想检查某些字段是否只包含纯文本.我想过寻找<字符,但这可以很容易地用在纯文本中.另一种方法可能是使用以下方法创建一个新的System.Xml.Linq.XElement:
XElement.Parse("<wrapper>" + MyString + "</wrapper>")
Run Code Online (Sandbox Code Playgroud)
并检查XElement是否包含子元素,但这似乎对我需要的东西有点重量级.
ICR*_*ICR 54
以下内容将匹配任何匹配的标记集.即<b>这个</ b>
Regex tagRegex = new Regex(@"<\s*([^ >]+)[^>]*>.*?<\s*/\s*\1\s*>");
Run Code Online (Sandbox Code Playgroud)
以下内容将匹配任何单个标记.即<b>(不必关闭).
Regex tagRegex = new Regex(@"<[^>]+>");
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它
bool hasTags = tagRegex.IsMatch(myString);
Run Code Online (Sandbox Code Playgroud)
J c*_*J c 22
您可以通过使用HttpUtility.HtmlEncode对输入进行编码来确保纯文本.
实际上,根据您希望检查的严格程度,您可以使用它来确定字符串是否包含HTML:
bool containsHTML = (myString != HttpUtility.HtmlEncode(myString));
Run Code Online (Sandbox Code Playgroud)
Jos*_*sef 10
干得好:
using System.Text.RegularExpressions;
private bool ContainsHTML(string CheckString)
{
return Regex.IsMatch(CheckString, "<(.|\n)*?>");
}
Run Code Online (Sandbox Code Playgroud)
这是最简单的方法,因为括号中的项目不太可能自然发生.
我刚尝试了我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的一个问题是纯文本符号和少于字符会导致XmlException并指示该字段包含HTML(这是错误的).要解决此问题,首先传入的输入字符串需要具有&符号,并且少于字符转换为其等效的XHTML实体.我写了另一种扩展方法来做到这一点:
public static string ConvertXHTMLEntities(this string input)
{
// Convert all ampersands to the ampersand entity.
string output = input;
output = output.Replace("&", "amp_token");
output = output.Replace("&", "&");
output = output.Replace("amp_token", "&");
// Convert less than to the less than entity (without messing up tags).
output = output.Replace("< ", "< ");
return output;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用用户提交的字符串并使用以下代码检查它是否包含HTML:
bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML();
Run Code Online (Sandbox Code Playgroud)
我不确定这是不是防弹,但我认为这对我的情况来说已经足够了.
this also checks for things like < br /> self enclosed tags with optional whitespace. the list does not contain new html5 tags.
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");
}
}
Run Code Online (Sandbox Code Playgroud)