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

标签 c# regex replace

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

相关文章:

javascript - 正则表达式组结果和或

php - 用于文本解析的 DSL

java - ReplaceAll 正则表达式匹配所有模式,无需特定字符串

java - 使用 Swizzle Stream 替换流中的字符串

c# - 字符串仅替换为特定的子字符串

c# - 单击按钮上的 Xamarin.Forms 动画(Flash 背景)

c# - 保留拖动位置不起作用 : jQuery draggable: position()

javascript - 无法在 Angular js中获取Braintree客户端 token

c# - 何时在 C# 中使用静态类

c# - MVC 正则表达式验证电子邮件