1

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

例如

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

这仅包含 HTML 标记,不包含文本。

4

5 回答 5

1
XDocument doc = XDocument.Parse(yourString);
bool containsText = doc.Root.DescendantNodes()
          .Count(el => el.GetType() == typeof (XText)) > 0

小费:

我经常将这种方法与SGMLReader结合使用,以确保 XDocument.Parse(...) 的有效 xml

于 2012-11-06T10:22:03.120 回答
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;
}
于 2012-11-06T11:53:29.830 回答
0

如果您只想解析有效的 XHTML,则可以使用默认 .NET 库中的类。XmlReaderXDocument

您将需要解析整个 HTML 字符串。对于每个元素,只需检查它是否包含任何文本。

但是,正如其他人所提到的,这仅适用于有效的 XML,而 HTML 通常不是。在这种情况下,您可能更喜欢其他答案中提到的库。

于 2012-11-06T10:15:37.827 回答
0

如果您使用HTML Agility Pack解析输入,则可以检查该document.DocumentNode.InnerText属性以查看整个片段中是否有任何文本。

于 2012-11-06T10:16:44.043 回答
-1

每当您处理 HTML 时,它都非常棘手。

您可以简单地使用正则表达式来实现,但请注意使用正则表达式解析 HTML 是一个坏主意!. 这仅仅是因为 HTML 的格式可能不正确。

如果您想正确执行此操作,我建议您使用诸如ArgoticHtmlAgilityPack之类的 HTML 解析器(它们都在 NuGet 中可用)。

希望能帮助到你

于 2012-11-06T10:19:43.227 回答