2010-05-14 16 views
6

Tôi đã xây dựng một hình thức aspitte litte tìm kiếm một cái gì đó và hiển thị kết quả. Tôi muốn làm nổi bật chuỗi tìm kiếm trong kết quả tìm kiếm. Ví dụ:trường hợp thay thế chuỗi thay thế mà chính xác làm việc với ligatures như "ß" <=> "ss"

Query: "p" 
Results: a<b>p</b>ple, banana, <b>p</b>lum 

Mã mà tôi có đi như thế này:

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); 
} 

tôi chủ yếu là các công trình nhưng thử ví dụ với HighlightSubstring("ß", "ss"). Sự cố này xảy ra do ở Đức "ß" và "ss" được coi là bằng theo phương pháp IndexOf, nhưng chúng có độ dài khác nhau!

Bây giờ sẽ ổn nếu có cách tìm hiểu thời gian khớp trong "văn bản" là bao lâu. Hãy nhớ rằng độ dài này có thể là != substring.Length.

Vậy làm cách nào để tìm hiểu độ dài của trận đấu IndexOf sản xuất với sự hiện diện của chữ ghép và ký tự ngoại ngữ (chữ ghép trong trường hợp này)?

+0

Chỉ cần tự hỏi: Tại sao chỉ đánh dấu "p" đầu tiên trong "quả táo"? – FrustratedWithFormsDesigner

+0

Bạn đúng, tôi sẽ sửa đổi điều này để làm nổi bật tất cả các trận đấu ;-) thx. – usr

+0

'StringComparison.OrdinalIgnoreCase' có làm những gì bạn muốn không? – Gabe

Trả lời

2

Điều này có thể không trực tiếp trả lời câu hỏi của bạn nhưng có lẽ sẽ giải quyết được vấn đề thực tế của bạn.

Tại sao không thay thế?

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>"); 
} 

Nhưng văn hóa là gì? Nếu bạn chỉ định Regex là không phân biệt chữ hoa chữ thường, nó sẽ nhạy cảm với văn hóa theo mặc định theo http://msdn.microsoft.com/en-us/library/z0sbec17.aspx.

+0

Tôi upvoted này, bởi vì nó là một giải pháp, nhưng tôi sẽ không sử dụng nó vì hiệu suất của việc tạo ra một regex tươi khoảng 100 lần cho mỗi yêu cầu sẽ là quá nhiều cho các mục đích của tôi. – usr

+0

Có thể giải quyết vấn đề biên dịch lại nếu bạn phải sử dụng Regex nhiều lần cho mỗi yêu cầu (tôi lấy nó có nhiều chuỗi văn bản để kiểm tra?). Tôi có thể nghĩ ra hai cách. Đầu tiên, bạn có thể sử dụng phương thức Regex.Replace tĩnh thay vì tạo phương thức cá thể như tôi làm trong mã. Sử dụng phương thức tĩnh gây ra .NET để cache regex (xem http://msdn.microsoft.com/en-us/library/8zbs0h2f.aspx). Hoặc, tạo regex bên ngoài phương thức HighlightString và sử dụng lại regex cho mỗi Thay thế. Cuối cùng, nếu vấn đề là nhiều chất nền, tạo ra một regex kết hợp chúng. – Andrew

Các vấn đề liên quan