突出显示字符串中的搜索词

时间:2016-01-29 15:00:57

标签: c# regex replace

我编写了一个与我的网站搜索功能兼容的功能。当用户搜索单词时,我对返回的搜索内容执行替换以获取用户在搜索中输入的任何单词,并使用自定义类将其包装在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;
}

1 个答案:

答案 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>