我有以下代码首先删除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()做第二次替换,所以区分大小写不是问题?谢谢!
答案 0 :(得分:2)
使用this overload获取RegexOptions。你会想要IgnoreCase值。
答案 1 :(得分:2)
首先让我们谈谈您用来删除标记的正则表达式<(.|\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
}
不要那样做。至少,向控制台发送错误消息或重新抛出要处理的调用代码的异常,但永远默默地吞下它们。