2010-05-14 37 views
6

這樣的連字符我已經構建了一個litte asp.net表單來搜索某些內容並顯示結果。我想突出顯示搜索結果中的搜索字符串。例如:不區分大小寫的字符串替換,正確地使用像「ß」<=>「ss」

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")嘗試例如。這崩潰,因爲在德國「ß」和「ss」被認爲是相等的IndexOf方法,,但他們有不同的長度

現在,如果有方法可以找出「文本」中匹配的時間長短,那就沒問題了。請記住,這個長度可以是!= substring.Length

那麼如何找出IndexOf在連字和外來語言字符(本例中爲連字)存在的情況下匹配的長度?

+0

只是想知道:爲什麼只突出「蘋果」中的第一個「p」? – FrustratedWithFormsDesigner 2010-05-14 15:45:46

+0

你說得對,我會修改這個以突出所有匹配;-) thx。 – usr 2010-05-14 17:01:38

+0

'StringComparison.OrdinalIgnoreCase'做你想要的嗎? – Gabe 2010-05-14 21:33:02

回答

2

這可能不會直接回答你的問題,但也許會解決你的實際問題。

爲什麼不替代呢?

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,默認情況下文化敏感。

+0

我提高了這一點,因爲它是一個解決方案,但我不會使用它,因爲創建一個新的正則表達式每個請求大約100次的性能對於我的目的來說太多了。 – usr 2010-05-19 17:44:15

+0

如果你必須每次請求多次使用正則表達式(我認爲它有多個文本字符串檢查?),那麼解決重新編譯問題是完全可能的。我可以想到兩種方法。首先,您可以使用靜態Regex.Replace方法,而不像我在代碼中那樣創建實例方法。使用靜態方法會導致.NET緩存正則表達式(請參閱http://msdn.microsoft.com/en-us/library/8zbs0h2f.aspx)。或者,在HighlightString方法外部創建正則表達式,併爲每個Replace重用正則表達式。最後,如果問題是多個子字符串,請創建一個組合它們的正則表達式。 – Andrew 2010-05-19 20:18:08

相關問題