是否可以在C#中检查HTML字符串是否实际包含某些文本或仅由HTML标记和实体组成?
例如
string str = @"<p xmlns=""http://www.w3.org/1999/xhtml"" />"
这只包含HTML标记而没有文字。
答案 0 :(得分:1)
XDocument doc = XDocument.Parse(yourString);
bool containsText = doc.Root.DescendantNodes()
.Count(el => el.GetType() == typeof (XText)) > 0
提示强>
我经常将此方法与SGMLReader结合使用,以确保XDocument.Parse(...)的有效xml
答案 1 :(得分:0)
如果您只想解析valid XHTML,可以使用默认.NET库中的类。 XmlReader
或XDocument
。
您需要解析整个HTML字符串。对于每个元素,只需检查它是否包含任何文本。
但是,正如其他人所提到的,这只适用于有效的XML,而HTML通常不适用。在这种情况下,您可能更好地使用其他答案中提到的库。
答案 2 :(得分:0)
如果使用HTML Agility Pack解析输入,则可以检查document.DocumentNode.InnerText
属性以查看整个片段中是否有任何文本。
答案 3 :(得分:0)
这是使用带有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;
}
答案 4 :(得分:-1)
每当你处理HTML时,它都非常棘手。
你可以通过正则表达式实现这一点,但请注意具有常规表达的PARSING HTML是一个糟糕的想法!!! 。这只是因为HTML格式不正确。
如果你想做得好,我建议使用HTML解析器,如 Argotic 或 HtmlAgilityPack (它们都可以在NuGet中使用)。
希望有所帮助