2010-03-07 2 views
0

Im работает над фильтром ответа. Им пытаются поймать всех expresion: $ sometext.sometext $ со следующим регулярным выражением:.^\ Ш + \ ш + \ $Response filter asp.net

В моей реализации это выглядит следующим образом:?

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 [email protected]"^\\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. Это не будет поймано моим регулярным выражением в методе write. Что мне не хватает?

+0

Неправильный метод замены. Response.Filter содержимое фрагментировано. Посмотрите http://www.west-wind.com/weblog/posts/2009/Nov/13/Capturing-and-Transforming-ASPNET-Output-with-ResponseFilter –

ответ

0

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

Я уверен, что есть другие, но один из способов протестировать ваши .NET reg ex-шаблоны - использовать this online tester.

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

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

Encoding encoding = HttpContext.Current.Response.ContentEncoding; 
string output = encoding.GetString(..); 
byte[] buffer = encoding.GetBytes(output); 
+0

Спасибо ... Он работает, когда я делаю этот тест: string input = "$ some.text $

hej hej hej
"; string regex = @ "^ \\ w +? \. \ W +? \ $"; Параметры RegexOptions = RegexOptions.Multiline; MatchCollection matches = Regex.Matches (ввод, регулярное выражение, опции); foreach (совпадение совпадений в матчах) { string value = match.Value; } Но, когда Im-тестирование на «contentInBuffer», это делает что-то, что угодно. Зачем? – Sune

+0

См. Мой пересмотренный ответ. – patmortech

Смежные вопросы