是否可以在 C# 中检查 HTML 字符串是否实际上包含一些文本或仅由 HTML 标记和实体组成?
例如
string str = @"<p xmlns=""http://www.w3.org/1999/xhtml"" />"
这仅包含 HTML 标记,不包含文本。
是否可以在 C# 中检查 HTML 字符串是否实际上包含一些文本或仅由 HTML 标记和实体组成?
例如
string str = @"<p xmlns=""http://www.w3.org/1999/xhtml"" />"
这仅包含 HTML 标记,不包含文本。
XDocument doc = XDocument.Parse(yourString);
bool containsText = doc.Root.DescendantNodes()
.Count(el => el.GetType() == typeof (XText)) > 0
小费:
我经常将这种方法与SGMLReader结合使用,以确保 XDocument.Parse(...) 的有效 xml
这是将正则表达式与 HTML 结合使用的一种有效方法。它通常不使用 HTML,因为 HTML 不是常规语言。然而,我们关心的特性可以用常规语言来表达——我们不关心标签的潜在无限嵌套,这就是 HTML 不是常规语言的原因。
或者换句话说,你不能用正则表达式解析 HTML 的规则仍然适用,但你实际上并没有在这里解析。(顺便说一句,递归正则表达式至少在理论上也允许解析 HTML)。
编写它的棘手之处在于>
属性值中允许这样做。如果不是这样,简单的表达式^(<[^>]*>)$
将是匹配仅标签字符串所需的全部内容(如果需要,也可以调整以允许空格)。
不过,处理>
属性的复杂性让我很喜欢:
public static bool IsTagsOnly(string html)
{
bool inTag = false;
char attChar = '\0';
foreach(char c in html)
{
if(char.IsWhiteSpace(c))//include or excise this bit depending on whether you count whitespace as "content"
{
continue;
}
if(!inTag)
{
if(c == '<')
inTag = true;
else
return false;
}
switch(c)
{
case '\'':
switch(attChar)
{
case '\'':
attChar = '\0';
break;
case '\0':
attChar = '\'';
break;
}
break;
case '"':
switch(attChar)
{
case '"':
attChar = '\0';
break;
case '\0':
attChar = '"';
break;
}
break;
case '>':
if(attChar == '\0')
inTag = false;
break;
}
}
return true;
}
如果您使用HTML Agility Pack解析输入,则可以检查该document.DocumentNode.InnerText
属性以查看整个片段中是否有任何文本。
每当您处理 HTML 时,它都非常棘手。
您可以简单地使用正则表达式来实现,但请注意使用正则表达式解析 HTML 是一个坏主意!. 这仅仅是因为 HTML 的格式可能不正确。
如果您想正确执行此操作,我建议您使用诸如Argotic或HtmlAgilityPack之类的 HTML 解析器(它们都在 NuGet 中可用)。
希望能帮助到你