摘要:[ASP.NET]如何從一堆字字中將特定文字標記起來
可以在查詢Button的 Click 事件中處理
protected void Button1_Click(object sender, EventArgs e) { //摸擬從DB取出資料 string OriginalString = GetDBData(); //要查詢的關鍵字 string SearchString = TextBox1.Text; //標註完關鍵字的字串 string ResultString = Regex.Replace(OriginalString, SearchString, (x) => string.Format("<span class='keyword'>{0}</span>", x.Value), RegexOptions.IgnoreCase); Literal1.Text = ResultString; } private string GetDBData() { return @"(路透香港21日電)......"; }
主要是使用System.Text.RegularExpressions命名空間下的Regex類別中的Replace方法
他多載多個方法
我選用的方法參數說明:
參數1:要「被」搜尋的字串
參數2:要搜尋的字串(關鍵字)
參數3:他是一個delegate要實作它,他會將找到符合的字用Match類別傳回給你處理,處理完後再將處理完的字串放回原本的位置,我在原字串的前後加上一個span html tag來套用CSS產生標記的效果
參數4:設定比對時忽略英文大小寫
<style type="text/css"> .keyword{ color:Blue; background-color:Gray;} </style>
註:如果要查詢類似的功能也許妳會使用 LIKE '%...%'之類的語法,但資料量大,文字多,這種的SQL語法非常的不好,正確的做法是將此欄位設定成全文檢索索引,效能會比使用 LIKE 來的快許多
補充:
delegate的從1.0開始就有了,只是每一代的寫法一直演化,所以列一下好了~順便練習一下
//.net 3.5 Lambda Expression string ResultString = Regex.Replace(OriginalString, SearchString, (x) => string.Format("<span class='keyword'>{0}</span>", x.Value), RegexOptions.IgnoreCase); //.net 1.0 要另外實作獨立的方法(最下面) MatchEvaluator me = new MatchEvaluator(MatchMethod); string ResultString1 = Regex.Replace(OriginalString, SearchString, me, RegexOptions.IgnoreCase); //.net 2.0 可以直接指定方法名稱了 string ResultString2 = Regex.Replace(OriginalString, SearchString, MatchMethod, RegexOptions.IgnoreCase); //.net 2.0 推出的匿名函式 string ResultString3 = Regex.Replace(OriginalString, SearchString, delegate(Match target) { return string.Format("<span class='keyword'>{0}</span>", target.Value); }, RegexOptions.IgnoreCase); ///////////////////////////// //.net 1.0 public string MatchMethod(Match target) { return string.Format("<span class='keyword'>{0}</span>", target.Value); }