Справочная информация: я написал небольшую библиотеку, которая может создавать элементы управления asp.net из строки.
Образец текста :
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
{{asp:hyperlink|NavigateUrl="/faq.aspx";Text="FAQ";}}
{{codesample|Text="FAQ";}}
accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur
Я получил свою первоначальную помощь здесь . Я расширил код с некоторой рефлексией, чтобы получить полную гибкость для возможности рендеринга WebControls и UserControls. Пока работает нормально, для каждого пользовательского контроля, который я тестировал. Теперь я сталкиваюсь с проблемой, заключающейся в том, что синтаксический анализ моего значения ключа свойства недостаточно гибок для поддержки произвольного мультимедийного содержимого.
Это часть кода, который я использую для строковых операций:
substring = substring.Replace("\\"", "\""); //substring is the string containing lore ipsum
substring = substring.Replace(""", "\"");
Regex r = new Regex("{{(?<single>([a-z0-9:]*))\\|((?<pair>([a-z0-9:]*=\"[a-z0-9.:/?_~=]*\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase);
Match m = r.Match(substring);
if (m.Success)
{
Dictionary<string, string> properties = new Dictionary<string, string>();
foreach (Capture cap in m.Groups["pair"].Captures)
{
string key = cap.ToString().Substring(0, cap.ToString().IndexOf("="));
if (!properties.ContainsKey(key))
{
string value = cap.ToString().Substring(cap.ToString().IndexOf("=\"") + 2);
value = value.Substring(0, value.Length - 2);
properties.Add(key, value);
}
}
MethodInfo dynamicRenderControl = null;
String controlString = m.Groups["single"].Value.ToLower();
}
(Строка взята из базы данных. Ранее она была установлена в моей CMS. Я оставил наш код для получения групп {{FOO | BAR = "Foo2";}})
Вот что делает регулярное выражение:
Пример:
{{asp:hyperlink|NavigateUrl="/faq.aspx";Text="FAQ";}}
Он разбирает "asp: hyperlink" на m.Groups ["single"]. Это строка, которая мне нужна для отображения на определенный тип элемента управления.
после '|' У меня есть список свойств, которые будут записаны в m.Groups ["pair"]. Captures.
Все это прекрасно работает, но не для многострочного или более сложного текста.
Э.Г.
{{codesample|Text="using System.Text;<br />\r\nusing System.Bla;";}}
Здесь мой код ломается.
Вопрос:
Как я должен настроить регулярное выражение, чтобы оно работало для многострочного текста, который начинается с \ "и заканчивается \"; хотя внутри этого текста также может быть \ "? Или это невозможно с регулярным выражением?
Редактировать : Я думал. Невозможно добиться того, чего я хочу с помощью регулярных выражений, потому что \ "в тексте автоматически нарушает код. Я переключаю внешний разделитель на синтаксис CDATA, который использует XML. Wikientry для CDATA
"<![CDATA[This is my content]]>";
Это означает, что каждая запись выглядит так:
{{codesample|Text="<![CDATA[this is text on the first line<br />\r\nthis is text on the second line]]>";}}
Где начало значения
"<![CDATA[
и конец
]]>";
Я пытался написать это регулярное выражение, но мне не удалось. Может ли кто-нибудь помочь мне с этим?