Я пишу код для страницы результатов поиска, которая должна выделять условия поиска. Термины встречаются в ячейках таблицы (приложение выполняет итерацию в ячейках строк GridView), и эти ячейки таблицы могут иметь HTML.
В настоящее время мой код выглядит следующим образом (соответствующие фрагменты показаны ниже):
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);
Удивительно, но это работает. НО, иногда текст, с которым я сопоставляю, - это HTML, который выглядит так:
<span class="CustomerName">Fred</span> was a classy individual.
И если вы ищете «класс», я хочу, чтобы код выделения выделил «класс» в «классном», но, конечно, не в HTML-атрибуте «класс», который там есть! Если вы ищете «Фред», это должно быть выделено.
Так что же такое хорошее регулярное выражение, которое гарантирует, что совпадения будут происходить только вне HTML-тегов? Это не должно быть супер хардкор. Я думаю, просто убедившись, что совпадение не между <и>, будет работать нормально.