Tôi đang viết mã cho trang kết quả tìm kiếm cần làm nổi bật cụm từ tìm kiếm. Các điều khoản xảy ra trong các ô bảng (ứng dụng đang lặp qua các ô Row GridView) và các ô bảng này có thể có HTML.Regex nào sẽ khớp với văn bản trừ thứ nằm trong các thẻ HTML?
Hiện nay, mã của tôi trông như thế này (hunks có liên quan trình bày dưới đây):
const string highlightPattern = @"<span class=""Highlight"">$0</span>";
DataBoundLiteralControl litCustomerComments = (DataBoundLiteralControl)e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Controls[0];
// Turn "term1 term2" into "(term1|term2)"
string spaceDelimited = txtTextFilter.Text.Trim();
string pipeDelimited = string.Join("|", spaceDelimited.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries));
string searchPattern = "(" + pipeDelimited + ")";
// Highlight search terms in Customer - Comments column
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);
Thật ngạc nhiên nó hoạt động. NHƯNG, đôi khi các văn bản tôi phù hợp trên là HTML mà trông như thế này:
<span class="CustomerName">Fred</span> was a classy individual.
Và nếu bạn tìm kiếm "class" Tôi muốn mã nổi bật để bọc các "lớp học" trong "sang trọng" nhưng tất nhiên không thuộc tính HTML "class" xảy ra ở đó! Nếu bạn tìm kiếm "Fred", cần được đánh dấu.
Vậy một regex tốt sẽ đảm bảo các kết quả phù hợp chỉ xảy ra ở đâu bên ngoài các thẻ html? Nó không phải là siêu hardcore. Đơn giản chỉ cần chắc chắn rằng trận đấu không phải là giữa < và> sẽ làm việc tốt, tôi nghĩ.
Nếu ai đó tìm kiếm Fred trong ví dụ của bạn, nếu nó được đánh dấu? –
Có. Cảm ơn bạn đã hỏi thăm. Câu hỏi hay. Tôi sẽ chỉnh sửa câu hỏi. – Chris