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

use*_*755 3 c# regex replace

我编写了一个与我的网站搜索功能配合使用的函数。当用户搜索单词时,我对返回的搜索内容执行替换,以获取用户在搜索中输入的任何单词,并将其包装在带有自定义类的 span 标记中,该类基本上会将页面上的单词加粗。在克服了必须合并不区分大小写的替换的第一个障碍之后,我现在陷入了另一个困境。页面上被替换的单词正在被页面上用户提供的情况替换,这看起来很有趣,因为返回的内容是很多合法文本和首字母缩略词。如果用户搜索“rpC 178”,则内容中的“RPC 178”将显示为粗体,与“rpC 178”的大小写相同。我的第一个想法是按“空格”分割内容,并在替换之前保留替换单词的临时副本,以保留其当前情况,但其中一些内容块可能超过 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;
}
Run Code Online (Sandbox Code Playgroud)

Nin*_*rry 5

您可以使用接受 MatchEvaluator 委托的 Regex.Replace 方法的其他重载。在这里,您传递一个方法,该方法获取作为参数找到的实际文本,并可以动态构建字符串以用作替换。

样本:

    string output = Regex.Replace(input, term, 
        match => startHtml + match.Value + endHtml, 
        RegexOptions.Compiled | RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

请注意,带有 => 符号的表示法可能不适用于旧版本的 C#。在这种情况下,您必须使用更长的形式:

    string output = Regex.Replace(input, term, new MatchEvaluator(match => 
         {
             return startHtml + match.Value + endHtml;
         }), 
         RegexOptions.Compiled | RegexOptions.IgnoreCase);
Run Code Online (Sandbox Code Playgroud)

因此,您还可以改进代码,因为您不需要对所有指定的搜索词进行 foreach 循环。只需构建一个包含所有要查找的术语的正则表达式,然后使用它进行搜索。

请记住,在使用 Regex 类进行搜索之前,使用 Regex.Escape() 对用户输入的数据进行转义,以便当用户输入在正则表达式中具有特殊含义的字符时,一切都按预期工作。

  • 您还必须考虑到,当搜索词出现在内容的 HTML 语法中时,您会遇到问题。例如,当用户搜索“div”时,您将创建无效的 HTML。有关对此的讨论,请参阅例如http://stackoverflow.com/questions/23745739/highlight-words-in-html-using-regex-in-c-sharp (2认同)