我已经建立了一个asp.net表单,用于搜索某些内容并显示结果。我想突出显示搜索结果中的搜索字符串。例子:
Query: "p"
Results: a<b>p</b>ple, banana, <b>p</b>lum
我拥有的代码如下所示:
public static string HighlightSubstring(string text, string substring)
{
var index = text.IndexOf(substring, StringComparison.CurrentCultureIgnoreCase);
if(index == -1) return HttpUtility.HtmlEncode(text);
string p0, p1, p2;
text.SplitAt(index, index + substring.Length, out p0, out p1, out p2);
return HttpUtility.HtmlEncode(p0) + "<b>" + HttpUtility.HtmlEncode(p1) + "</b>" + HttpUtility.HtmlEncode(p2);
}
我主要工作,但可以尝试使用
HighlightSubstring("ß", "ss")
。之所以崩溃,是因为IndexOf
方法将“ß”和“ss”在德国视为等于,但是长度不同!现在,如果有一种方法可以找出“文本”中的匹配项多长时间,那就可以了。请记住,此长度可以是
!= substring.Length
。那么,如何找出存在连字和外来语言字符(在这种情况下为连字)的情况下
IndexOf
产生的匹配长度? 最佳答案
这可能不会直接回答您的问题,但可能会解决您的实际问题。
为什么不替代呢?
using System.Text.RegularExpressions;
public static string HighlightString(string text, string substring)
{
Regex r = new Regex(Regex.Escape(HttpUtility.HtmlEncode(substring)),
RegexOptions.IgnoreCase);
return r.Replace(HttpUtility.HtmlEncode(text), @"<b>$&</b>");
}
但是什么文化呢?如果将正则表达式指定为不区分大小写,则默认根据http://msdn.microsoft.com/en-us/library/z0sbec17.aspx区分区域性。