asp.net regex.replace () - PullRequest
       2

asp.net regex.replace ()

0 голосов
/ 12 сентября 2010

У меня есть следующий код, чтобы сначала удалить теги html, а затем выделить поисковый термин в результирующем тексте:

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    try
    {
        // get search value query string
        string searchText = Request.QueryString["search"].Trim();
        string encodedValue = Server.HtmlEncode(searchText);

        Literal Content = e.Item.FindControl("Content") as Literal;
        string contentText = Content.Text;
        Content.Text = Regex.Replace(contentText, @"<(.|\n)*?>", string.Empty).Replace(encodedValue, "<font class='highlight2'>" + encodedValue + "</font>");
    }
    catch
    {
        // do nothing
    }
}

Это работает в некоторой степени, но вторая замена не учитывает регистр.Как я могу сделать вторую замену также regex.replace (), чтобы чувствительность к регистру не была проблемой?Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 сентября 2010

Сначала поговорим о регулярном выражении, которое вы используете для удаления тегов, <(.|\n)*?>.Если вы хотите, чтобы точка соответствовала чему-либо , включая символ новой строки, вам следует использовать однострочный режим.Он также известен как режим DOTALL в некоторых вариантах, потому что это то, что он делает: позволяет точке соответствовать символам новой строки.Вы можете использовать для этого флаг RegexOptions.Singleline или встроить его в регулярное выражение с помощью встроенного модификатора:

`(?s)<.*?>`

Это все еще довольно хрупко, но я оставлю это, потому что нет способасделать его пуленепробиваемым;регулярные выражения и HTML в корне несовместимы.

Что касается второй замены, первое, что вам нужно сделать, это разбить эти вызовы связанных методов - фактически, я бы сказал, что они никогда не должны были быть связаны.Подача результата Regex.Replace непосредственно в String.Replace является либо ошибкой, либо слишком умной.В любом случае, у вас есть , чтобы разделить их, если вы хотите дважды вызвать Regex.Replace.

Вам также необходимо экранировать любые метасимволы регулярных выражений в поисковом выражении, предполагая, что вы все еще хотите это сделатьбуквальный поиск, а не поиск по регулярному выражению.Для этого вы можете использовать метод Escape.

string searchText = Request.QueryString["search"].Trim();
string encodedValue = Server.HtmlEncode(searchText);
string escapedValue = Regex.Escape(encodedValue);

string contentText = Content.Text;
contentText = Regex.Replace(contentText, @"(?s)<.*?>", string.Empty);
contentText = Regex.Replace(contentText, escapedValue, 
    "<font class='highlight2'>$&</font>", RegexOptions.IgnoreCase);
Content.Text = contentText;

В вашем коде есть еще несколько вещей, которые мне не кажутся правильными (например, почему вы, кажется, навсегда удаляете все теги), ноЯ пытаюсь сосредоточиться на вашем актуальном вопросе.С этой целью я попытался внести минимально необходимые изменения в код, чтобы проиллюстрировать мой ответ.Но есть еще одна вещь, которую я просто должен прокомментировать:

catch
{
    // do nothing
}

Не делайте этого.По крайней мере, отправьте сообщение об ошибке на консоль или сбросьте исключение для вызывающего кода, чтобы иметь дело с ним, но никогда молча не проглотит их.

2 голосов
/ 12 сентября 2010

Используйте эту перегрузку , которая принимает RegexOptions .Вам понадобится значение IgnoreCase.

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