我编写了一个与我的站点搜索功能一起使用的函数。当用户搜索一个词时,我对返回的搜索内容执行替换以获取用户在搜索中输入的任何词,并将其包装在带有自定义类的 span 标签中,该类基本上会将页面上的词加粗。在克服了必须合并不区分大小写的替换的第一个障碍之后,我现在陷入了另一个困境。页面上被替换的词被替换为页面上用户提供的案例,这看起来很有趣,因为返回的内容是很多法律文本和首字母缩略词。如果用户要搜索“rpC 178”,则内容中的“RPC 178”将显示为粗体且大小写相同的“rpC 178”。我的第一个想法是按“空格”拆分内容,并在替换之前保留被替换单词的临时副本,以保留其当前大小写,但其中一些内容 block 可能超过 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;
}
最佳答案
您可以使用接受 MatchEvaluator 委托(delegate)的 Regex.Replace 方法的其他重载。在这里,您传递了一个方法,该方法获取找到的实际文本作为参数,并可以动态构建字符串以用作替换。
示例:
string output = Regex.Replace(input, term,
match => startHtml + match.Value + endHtml,
RegexOptions.Compiled | RegexOptions.IgnoreCase);
请注意,带有 => 符号的表示法可能不适用于旧版本的 C#。在这种情况下,您必须使用更长的形式:
string output = Regex.Replace(input, term, new MatchEvaluator(match =>
{
return startHtml + match.Value + endHtml;
}),
RegexOptions.Compiled | RegexOptions.IgnoreCase);
所以您还可以改进您的代码,因为您不需要对所有指定的搜索词进行 foreach 循环。只需构建一个包含所有要查找的术语的正则表达式,然后将其用于搜索。
在使用 Regex 类进行搜索之前,请记住使用 Regex.Escape() 对用户输入的数据进行转义,这样当用户输入在正则表达式中具有特殊含义的字符时,一切都会按预期进行。
关于c# - 突出显示字符串中的搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35087535/