[ASP.NET]如何從一堆文字中將特定文字標記起來

摘要:[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);
        }