2012-11-06 2 views
1

Возможно ли в C# проверить, действительно ли строка HTML содержит какой-либо текст или только состоит из HTML-тегов и сущностей?Обнаружение строки, содержащей только HTML и текст

Например

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

Это содержит только HTML-теги и не текст.

+0

Я бы рекомендовал смотреть на: - http://stackoverflow.com/questions/846994/how-to -use-html-agility-pack – Derek

ответ

0

Если вы хотите только разобрать valid XHTML, вы можете использовать классы из библиотеки .NET .NET. XmlReader или XDocument.

Вам необходимо проанализировать всю строку HTML. Для каждого элемента просто проверьте, содержит ли он какой-либо текст.

Однако, как отмечали другие, это будет работать только для допустимого XML, который часто не является HTML. В этом случае вы, вероятно, лучше с библиотеками, как упоминалось в других ответах.

+1

Html не Xml –

+0

@LB Он использует пространство имен XHTML. Если я не ошибаюсь, это должен быть строгий XML? Хороший момент, хотя он хочет разобрать _any_ HTML. –

0

Если вы разобрали свой ввод с помощью HTML Agility Pack, вы можете проверить свойство document.DocumentNode.InnerText, чтобы увидеть, есть ли какой-либо текст во всем фрагменте.

+0

Что делать, если ваш фрагмент «Я смеюсь» «'? – TrueWill

+0

Я честно не знаю, но даже если он обрабатывает '' как HTML-тег, внутренний текст должен по-прежнему содержать «Я смеюсь», а не пуст. – Rawling

+0

'var doc = new HtmlDocument(); doc.LoadHtml («Я смеюсь »); Console.WriteLine (doc.DocumentNode.InnerText); 'prints" Я смеюсь ". – TrueWill

-1

Всякий раз, когда вы имеете дело с HTML, это довольно сложно.

Вы могли бы просто добиться этого с помощью регулярного выражения, но обратите внимание, что ПАРКИ HTML С РЕГУЛЯРНЫМ ВЫРАЖЕНИЕМ - ПЛОХАЯ ИДЕЯ !!!. Это просто потому, что HTML может быть неправильно отформатирован.

Если вы хотите, чтобы сделать это правильно, я предложил бы использовать HTML парсер как Argotic или HtmlAgilityPack (оба они доступны в NuGet).

Надеется, что это помогает

+0

OP ничего не говорил о Regex. Не нужно кричать. [О, да, вы можете использовать регулярные выражения для анализа HTML!] (Http://stackoverflow.com/a/4234491/932418) –

+0

Я не кричал, только подчеркивал, что Regex не следует использовать. –

+1

@SebastianSiek В этом случае, пожалуйста, не _over_ emphatize. ; p –

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

Совет:

Я часто комбинирую этот подход с SGMLReader, чтобы обеспечить правильный XML для XDocument.Parse (...)

+0

Отличный совет в обновлении! Объединение 'SGMLReader' с' XDocument' кажется отличным решением для меня. –

0

Это один случай где использование регулярного выражения с HTML будет правильным подходом. Обычно это не с HTML, потому что HTML не является обычным языком. Тем не менее, функции, о которых мы заботимся, могут быть выражены в терминах обычного языка - мы не заботимся о потенциально неограниченном вложенности тегов, что делает HTML не регулярным языком.

Или, другими словами, правило, что вы не можете анализировать HTML с регулярным выражением, по-прежнему применяется, но вы на самом деле не разбираетесь здесь. (Кстати, рекурсивное регулярное выражение также позволяет анализировать HTML, по крайней мере теоретически).

Сложный бит в письменном виде - это то, что > разрешено в значениях атрибутов. Там, где это не так, простое выражение ^(<[^>]*>)$ было бы все, что нужно для соответствия строкам только для тегов (при необходимости отрегулируйте пробелы, если хотите).

fiddliness борьбы с > в атрибутах, хотя, делает меня благосклонность:

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; 
} 
Смежные вопросы