Regex для анализа html из CDATA с помощью С#

Я хотел бы проанализировать любые данные HTML, которые возвращаются в CDATA.

Например <![CDATA[<table><tr><td>Approved</td></tr></table>]]>

Спасибо!


person Little Larry Sellers    schedule 01.05.2009    source источник
comment
Можете быть более конкретными? У вас есть документ XML, содержащий раздел CDATA, и вы хотите получить строку, содержащую содержимое этого раздела CDATA?   -  person Tim Robinson    schedule 01.05.2009
comment
Я получаю это в DataTable как один из столбцов в результирующем наборе в виде строки точно так же, как в примере, который я написал выше, поэтому я просто хочу сделать регулярное выражение, чтобы получить содержимое и вернуть в браузер только строку html через AJAX-вызов.   -  person Little Larry Sellers    schedule 01.05.2009


Ответы (6)


Выражение для обработки вашего примера будет

\<\!\[CDATA\[(?<text>[^\]]*)\]\]\>

Где группа «текст» будет содержать ваш HTML.

Код С#, который вам нужен:

using System.Text.RegularExpressions;
RegexOptions   options = RegexOptions.None;
Regex          regex = new Regex(@"\<\!\[CDATA\[(?<text>[^\]]*)\]\]\>", options);
string         input = @"<![CDATA[<table><tr><td>Approved</td></tr></table>]]>";

// Check for match
bool   isMatch = regex.IsMatch(input);
if( isMatch )
  Match   match = regex.Match(input);
  string   HTMLtext = match.Groups["text"].Value;
end if

Переменная "input" находится там только для того, чтобы использовать образец ввода, который вы предоставили.

person Ron Harlev    schedule 01.05.2009
comment
вероятно, лучше использовать .* вместо [^]]* для текстовой группы, иначе любой HTML с ] в нем предотвратит совпадение. - person TheXenocide; 05.08.2011

Я знаю, это может показаться невероятно простым, но пробовали ли вы string.Replace()?

string x = "<![CDATA[<table><tr><td>Approved</td></tr></table>]]>";
string y = x.Replace("<![CDATA[", string.Empty).Replace("]]>", string.Empty);

Вероятно, есть более эффективные способы справиться с этим, но может случиться так, что вы хотите что-то настолько простое...

person Scott Anderson    schedule 01.05.2009

Не так много деталей, но очень простое регулярное выражение должно соответствовать ему, если нет сложности, которую вы не описали:

/<!\[CDATA\[(.*?)\]\]>/
person Chad Birch    schedule 01.05.2009
comment
Хотя я не думаю, что побег ‹ действительно необходим. - person Tomalak; 01.05.2009
comment
Экранирование ‹ и › не требуется в регулярном выражении С# - person patjbs; 01.05.2009

Регулярное выражение для поиска разделов CDATA будет таким:

(?:<!\[CDATA\[)(.*?)(?:\]\]>)
person Tomalak    schedule 01.05.2009

Почему вы хотите использовать Regex для такой простой задачи? Попробуй это:

str = str.Trim().Substring(9);
str = str.Substring(0, str.Length-3);
person Adren    schedule 09.09.2011

person    schedule
comment
Фиксированный! Извините, не знал, что это действительно там :) - person patjbs; 02.05.2009