检测仅包含HTML而不包含文本的字符串

时间:2012-11-06 10:11:06

标签: c# html-parsing html

是否可以在C#中检查HTML字符串是否实际包含某些文本或仅由HTML标记和实体组成?

例如

string str = @"<p xmlns=""http://www.w3.org/1999/xhtml"" />"

这只包含HTML标记而没有文字。

5 个答案:

答案 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库中的类。 XmlReaderXDocument

您需要解析整个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中使用)。

希望有所帮助