我编写了一个与我的网站搜索功能兼容的功能。当用户搜索单词时,我对返回的搜索内容执行替换以获取用户在搜索中输入的任何单词,并使用自定义类将其包装在span标记中,该自定义类将基本上加粗页面上的单词。在克服了我不得不采用不区分大小写的替代品的第一个障碍后,我现在陷入了另一个困境。页面上替换的单词将被页面上用户提供的大小写替换,因为返回的内容是很多法律文本和首字母缩略词。如果用户要搜索" rpC 178"," RPC 178"在内容中显示为粗体和相同的情况" rpC 178"。我的第一个想法是将内容分成" space"并且在更换之前保留已替换单词的临时副本以保留它的当前情况,但这些内容块中的一些可能超过4000个单词,因此效率低下。我是以错误的方式解决这个问题吗?
这是我目前的代码:
public static String HighlightWords(String content, String className, String searchTerms)
{
string[] terms = new string[] { };
if (!string.IsNullOrWhiteSpace(searchTerms))
{
terms = searchTerms.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
}
if (terms == null || terms.Length == 0)
{
return content;
}
var optimizedContent = new StringBuilder(content);
var startHtml = string.Format("<span class=\"{0}\">", className);
var endHtml = "</span>";
string result = string.Empty;
foreach (var term in terms)
{
result = Regex.Replace(optimizedContent.ToString(), term, string.Format("{0}" + term + "{1}", startHtml, endHtml), RegexOptions.Compiled | RegexOptions.IgnoreCase);
}
return result;
}
答案 0 :(得分:2)
您可以使用接受MatchEvaluator委托的Regex.Replace方法的其他重载。在这里,您传递一个方法,该方法将实际文本作为参数找到,并且可以动态构建字符串以用作替换。
样品:
string output = Regex.Replace(input, term,
match => startHtml + match.Value + endHtml,
RegexOptions.Compiled | RegexOptions.IgnoreCase);
注意带有=&gt;的符号符号可能无法与旧版本的C#一起使用。在这种情况下,您必须使用更长的形式:
string output = Regex.Replace(input, term, new MatchEvaluator(match =>
{
return startHtml + match.Value + endHtml;
}),
RegexOptions.Compiled | RegexOptions.IgnoreCase);
因此,您还可以改进代码,因为您不需要对所有指定的搜索项进行foreach循环。只需构建一个包含要查找的所有术语的正则表达式,然后将其用于搜索。
在使用Regex类进行搜索之前,请记住使用Regex.Escape()来转义用户输入的数据,这样当用户输入正则表达式中具有特殊含义的字符时,一切都按预期工作。 / p>