Использование функции замены RegEx в C # ASP.NET - PullRequest
0 голосов
/ 18 февраля 2010

Как мне решить проблему ниже?

Я создаю простую систему управления контентом, в которой есть шаблон HTML со специальной разметкой, которая обозначает, где должен быть контент:

<html><head></head><body><!-- #Editable "Body1" --><p>etc etc</p><!-- #Editable "Extra" --></body></html>

Помимо этого, в поле базы данных есть содержимое, которое выглядит примерно так:

<!-- #BeginEditable "Body1" -->This is Test Text<!-- #EndEditable --><!-- #BeginEditable "Extra" -->This is more test text<!-- #EndEditable -->

Как вы можете догадаться, мне нужно объединить два, то есть заменить

<!-- #Editable "Body1" -->

с:

This is Test Text

Я начал код здесь. Но у меня проблемы с использованием функции Regex Replace, которая должна быть расположена в самом низу этой функции For / Each ....

    //Html Template
    string html = "<html><head></head><body><!-- #Editable \"Body1\" --><p>etc etc</p><!-- #Editable \"Extra\" --></body></html>";        

    //Regions that need to be put in the Html Template
    string regions = "<!-- #BeginEditable \"Body1\" -->This is Test Text<!-- #EndEditable --><!-- #BeginEditable \"Extra\" -->This is more test text<!-- #EndEditable -->";

    //Create a Regex to only extract what's between the 'Body' tag
    Regex oRegex = new Regex("<body.*?>(.*?)</body>", RegexOptions.Multiline);

    //Get only the 'Body' of the html template
    string body = oRegex.Match(html).Groups[1].Value.ToString();

    // Regex to find sections inside the 'Body' that need replacing with what's in the string 'regions'
    Regex oRegex1 = new Regex("<!-- #Editable \"(.*?)\"[^>]*>",RegexOptions.Multiline);
    MatchCollection matches = oRegex1.Matches(body);

    // Locate section titles i.e. Body1, Extra
    foreach (Match match in matches)
    {
        string title = oRegex1.Match(match.ToString()).Groups[1].ToString();
        Regex oRegex2 = new Regex("<!-- #BeginEditable \"" + title + "\"[^>]*>(.*?)<!-- #EndEditable [^>]*>", RegexOptions.Multiline);
        //
        //
        // Replace the 'Body' sections with whats in the 'regions' string cross referencing the titles i.e. Body1, Extra
        //
        //
        //
    }

Ответы [ 4 ]

1 голос
/ 18 февраля 2010

Не оптимизировано для производительности (или чего-либо еще), но это просто и работает:

var html = "<html><head></head><body><!-- #Editable \"Body1\" --><p>etc etc</p><!-- #Editable \"Extra\" --></body></html>";
var regions = "<!-- #BeginEditable \"Body1\" -->This is Test Text<!-- #EndEditable --><!-- #BeginEditable \"Extra\" -->This is more test text<!-- #EndEditable -->";
var regionRegex = new Regex(@"<!-- #BeginEditable ""(?<Name>\w+)"" -->(?<Content>.*?)<!-- #EndEditable -->", RegexOptions.Multiline);
var regionMatches = regionRegex.Matches(regions);

foreach (Match regionMatch in regionMatches)
{
    var regionName = regionMatch.Groups["Name"].Value;
    var regionContent = regionMatch.Groups["Content"].Value;
    html = html.Replace(string.Format(@"<!-- #Editable ""{0}"" -->", regionName), regionContent);
}
0 голосов
/ 18 февраля 2010

используйте MatchEvaluator в качестве анонимного делегата, ваш код будет выглядеть как

string html = "<html><head></head><body><!-- #Editable \"Body1\" --><p>etc etc</p><!-- #Editable \"Extra\" --></body></html>";
string regions = "<!-- #BeginEditable \"Body1\" -->This is Test Text<!-- #EndEditable --><!-- #BeginEditable \"Extra\" -->This is more test text<!-- #EndEditable -->";

Regex oRegex1 = new Regex("<!-- #Editable \"(.*?)\"[^>]*>", RegexOptions.Multiline);

html = oRegex1.Replace(html, delegate(Match m) {
    string title = m.Groups[1].Value;
    Regex oRegex2 = new Regex("<!-- #BeginEditable \"" + title + "\"[^>]*>(.*?)<!-- #EndEditable [^>]*>", RegexOptions.Multiline);
    return oRegex2.Match(regions).Groups[1].Value;
});
0 голосов
/ 18 февраля 2010

Я бы предложил использовать такой шаблонный движок, как NVelocity для такого рода вещей.

0 голосов
/ 18 февраля 2010

Возможно, будет лучше использовать Html Agility Pack , чтобы справиться с этим, а затем использовать регулярные выражения. Он может анализировать Html в XML-подобном дереве в структуре DOM, и было бы легче справиться с этой проблемой с помощью этого пакета.

Edit:

string sReg = @"<body.*?>((?<Region>\<\!\-\-\s+\#Editable\s?\\$(?<editable>.+)\\$\s?\-\-\>[^\>]).*?)";
string sNewReg = sReg1.Replace('$', '\"');            System.Diagnostics.Debug.WriteLine(string.Format("Regex: {0}", sNewReg))
Regex MyRegex = new Regex(sNewReg,
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );
string sMg = "<html><head></head><body><!-- #Editable \\\"Body1\\\" --><p>etc etc</p><!-- #Editable \\\"Extra\\\" --></body></html>";
Match m = MyRegex.Match(sMg);
if (m.Success)
{
  System.Diagnostics.Debug.WriteLine(string.Format("{0}", m.Groups["editable"].Value));
}

Обратите внимание, как мне пришлось использовать знак доллара, чтобы избежать побега, и заменить его двойной кавычкой во время выполнения ..

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

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