Фильтр ответов asp.net

Я работаю над фильтром ответов. Я пытаюсь уловить все выражения: $sometext.sometext$ со следующим регулярным выражением: ^\w+?.\w+?\$

В моей реализации это выглядит так:

public override void Write(byte[] buffer, int offset, int count)
{
    // Convert the content in buffer to a string
    string contentInBuffer = UTF8Encoding.UTF8.GetString(buffer);


    string regex=@"^\\w+?\.\w+?\$";
    RegexOptions options = RegexOptions.Multiline;

    MatchCollection matches = Regex.Matches(contentInBuffer , regex, options);
    foreach (Match match in matches)
    {
        string value = match.Value;

    }
    outputStream.Write(UTF8Encoding.UTF8.GetBytes(contentInBuffer), offset, UTF8Encoding.UTF8.GetByteCount(contentInBuffer));

}

Проблема в том, что когда я пишу $Catch.Me$ на странице aspx, она не будет поймана моим регулярным выражением в методе записи. Что мне не хватает?


person Sune    schedule 07.03.2010    source источник
comment
Ваш метод замены неверен. Содержимое Response.Filter разбито на части. Посмотрите на west-wind.com/weblog/posts/2009/Nov/13/   -  person Evgeni Nabokov    schedule 19.04.2013


Ответы (1)


Вам не хватает первого $ в шаблоне регулярного выражения. Должно быть: ^\$\w+?\.\w+?\$. Если вы используете это, то оно должно совпадать.

Я уверен, что есть и другие, но один из способов проверить шаблоны регулярных выражений .NET — использовать этого онлайн-тестера.

Другая проблема, с которой вы можете столкнуться, заключается в том, что ASP.NET разбивает вывод на несколько фрагментов, поэтому ваш фильтр может вызываться несколько раз (с каждым фрагментом, который необходимо обработать). Это может привести к тому, что ваши шаблоны регулярных выражений не будут совпадать, потому что вся страница не находится там вместе. Вот пара статей, связанных с этим, и некоторые решения: Статья 1 @ west- wind.com, Статья 2 @ highoncoding.com.

Единственная другая вещь, которая может быть проблемой, - это неправильная кодировка. В приведенной выше статье о западном ветре он делает следующее для своих методов GetString и GetBytes:

Encoding encoding = HttpContext.Current.Response.ContentEncoding;
string output = encoding.GetString(..);
byte[] buffer = encoding.GetBytes(output);
person patmortech    schedule 07.03.2010
comment
Спасибо... Это работает, когда я делаю этот тест: string input = $some.text$ ‹div› hej hej hej ‹/div›; строка регулярное выражение=@^\\w+?\.\w+?\$; Опции RegexOptions = RegexOptions.Multiline; MatchCollection соответствует = Regex.Matches (ввод, регулярное выражение, параметры); foreach (совпадение совпадений в совпадениях) { string value = match.Value; } Но когда я тестирую contentInBuffer, он ничего не улавливает. Почему? - person Sune; 07.03.2010