Intereting Posts
Использование foreach для вставки данных gridview в базу данных sql F # Дискриминация использования Союза из C # Почему я получаю ошибку «Небезопасный код может появляться только при компиляции с / unsafe»? Ошибка при добавлении записей для доступа к базе данных из c # .net Архитектура Generics и Parent / Child Чтобы вызвать этот метод, свойство «Membership.Provider» должно быть экземпляром «ExtendedMembershipProvider», Как вы объявляете Func с анонимным типом возврата? Команда WPF MVVM может включать / отключать кнопку Linq пересекается или соединяется, чтобы возвращать элементы из одной коллекции, имеющие соответствующие свойства другому? Как я могу общаться с API Kronos? Переопределение OnPaint никогда не вызывается Поставщик членства ASP.NET – сброс паролей – подтверждение электронной почты и изменение пароля System.Web.Script.Serialization.JavaScriptSerializer или System.Runtime.Serialization.Json.DataContractJsonSerializer? C # предотrotation исключения коллекции было изменено Пользовательский раздел конфигурации: не удалось загрузить файл или сборку

Обнаружение строки, содержащей только HTML и текст

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

Например

string str = @"

"

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

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

Совет:

Я часто совмещаю этот подход с SGMLReader для обеспечения допустимого xml для XDocument.Parse (…)

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

Если вы хотите только проанализировать действительный XHTML , вы можете использовать classы из библиотеки .NET по умолчанию. XmlReader или XDocument .

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

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

Это тот случай, когда использование регулярного выражения с 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; } 

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

Вы могли бы просто добиться этого с регулярным выражением, но обратите внимание, что PARSING HTML с REGULAR EXPRESSION – ПЛОХАЯ ИДЕЯ !!! , Это просто потому, что HTML может быть неправильно отформатирован.

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

Надеюсь, поможет