Как определить, будет ли строка html показываться пустой в браузере? (C # / регулярное выражение?) - PullRequest
2 голосов
/ 27 января 2010

У меня есть элемент управления, который вернет мне html в виде строки. Прежде чем вывести это на экран, я бы хотел сказать, будет ли он пустым.

Например, элемент управления может вернуть <p><br /></p>, что, когда я тестирую использование C # для строки. Очевидно, что это не так - но на экране ничего не отображается.

Существует ли функция регулярного выражения для проверки, будет ли html отображать какой-либо текст на экране? Или с использованием C # - есть ли какая-нибудь функция для проверки строки, содержащей html, чтобы увидеть, содержит ли она что-либо кроме тегов?

Привет, я немного запутался, как обойти это без написания какого-то пользовательского парсера, путь, по которому я не хочу идти!

Ответы [ 5 ]

5 голосов
/ 27 января 2010

В ответ @Ignacio вам следует использовать что-то вроде пакета Agility для HTML. Вот пример кода, который, кажется, работает для вашей ситуации.

HtmlDocument docEmpty = new HtmlDocument();
docEmpty.LoadHtml("<p><br /></p>");

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("<p>I am not empty...<br /></p>");

bool shouldBeEmpty = string.IsNullOrEmpty(docEmpty.DocumentNode.InnerText);
bool shouldNotByEmpty = string.IsNullOrEmpty(doc.DocumentNode.InnerText);

Примечание. В этом примере используется синтаксический анализатор http://html -agility-pack.net /? Z = codeplex .

4 голосов
/ 27 января 2010

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

Может быть, ваша идея использовать регулярные выражения не так уж плоха. Это тоже должно быть быстрее. Я предлагаю вам использовать Regex , чтобы заменить каждый открывающий и закрывающий тег пустой строкой. Все, что не заменено, должно быть текстом, появляющимся в интернет-браузере ...

string input = "<p> <br />  </p>";
  string pattern = "<[^<>^]+?>";
  string replacement = "";
  string result1 = Regex.Replace(input, pattern,replacement);
  pattern = "[\s\t\n]*"; ///filter for space, new line, tab 
  string result_final = Regex.Replace(result1 , pattern, replacement);
  if (string.IsNullOrEmpty(result_final)) ... /// empty html
1 голос
/ 29 ноября 2011

Проблема с ответом @ kane заключается в том, что бывают случаи, когда внутренний текст является законно пустым ... например,

<p><a href="http://somewhere.com"><img src="image/page" /></a></p>

Если вы просто положитесь на innertext, то этот парень наверху будет помечен как пустой.

Мне нравится пакет Agility HTML, но не забудьте также проверить innerhtml ...

1 голос
/ 27 января 2010

Не уверен, что это уместно, но я сделал этот тест, и, похоже, это то, чего хочет ОП, без использования какой-либо внешней библиотеки (но требующей .Net> 3.0)

XElement docEmpty = XElement.Parse("<p><br /></p>");
Console.WriteLine(string.IsNullOrEmpty(docEmpty.Value)); // Outputs True.

XElement doc = XElement.Parse("<p>This is a test<br /></p>");
Console.WriteLine(string.IsNullOrEmpty(doc.Value)); // Outputs False.
1 голос
/ 27 января 2010

Не пишите собственный анализатор, просто используйте существующий анализатор и примените к нему некоторые правила поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...