给定搜索查询:
Sheeky's
删除特殊字符,并将其缩小为:
sheekys
相同的过滤器应用于我正在搜索的数据库中的字段。这样就可以搜索:
sheekys
将返回名为“
”的项目的结果Sheeky's Item
这是过滤器:
public static string FilterSearchQuery(string query)
{
return Regex.Replace(query, "[^0-9A-Za-z ]", "");
}
在搜索结果视图中,匹配的单词会突出显示,如下所示:
public string HighlightText(string text)
{
foreach (var word in HighlightWords)
{
var findWord = word.Trim();
if (findWord.Length > 0)
{
var itemRegex = new Regex(findWord, RegexOptions.IgnoreCase);
foreach (var match in itemRegex.Matches(text))
{
text = text.Replace(match.ToString(),
"¬¬¬¬¬¬¬____¬¬¬¬¬¬" + match.ToString() + "````````____`````");
}
}
}
text = text.Replace("¬¬¬¬¬¬¬____¬¬¬¬¬¬", "<span class=\"highlighted\">");
text = text.Replace("````````____`````", "</span>");
return text.Replace("</span> <span class=\"highlighted\">", " ");
}
这突出了精确匹配。但是,我想对其进行扩展,以便在搜索字词为Sheeky's
时突出显示Sheeky
。 HighlightWords
是搜索的字词列表(没有任何过滤)。
有谁知道怎么做?
答案 0 :(得分:0)
我认为你可以这样做:
var itemRegex = new Regex(findWord + ".*", RegexOptions.IgnoreCase);
以上内容将匹配Sheeky
以及之后的任何内容。
答案 1 :(得分:0)
问题是在原始文本中找到匹配,而忽略非字母。使用一些正则表达式魔法可以起作用:
var content = "This is a long string with word's, words and Words"; // the text to search in
var tofind = "W'ords"; // the text to search for
// prepare search value: remove non-letters/digits, set to lowercase
tofind = Regex.Replace(tofind, @"\W", "").ToLower();
// create search regex: allow non-letter between the letters
var findregex = String.Join(@"\W*", tofind.ToCharArray().Select(c => c.ToString()));
// surround matches with a <mark> tag
var content2 = Regex.Replace(content, findregex, "<mark>$0</mark>", RegexOptions.IgnoreCase);
结果是
This is a long string with <mark>word's</mark>, <mark>words</mark> and <mark>Words</mark>