Я пишу код для страницы результатов поиска, которая должна выделять поисковые запросы. Эти термины встречаются внутри ячеек таблицы (приложение выполняет итерацию через ячейки строки GridView), и эти ячейки таблицы могут иметь HTML.Какое регулярное выражение будет соответствовать тексту, исключая то, что находится в тегах 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 «класс», который, оказывается, там! Если вы ищете «Fred», это должно быть выделено.
Итак, что хорошего регулярного выражения, которое позволит убедиться, что совпадения происходят только в OTTSIDE html-тегах? Это не должно быть супер хардкор. Просто убедитесь, что матч не между < и> будет работать нормально, я думаю.
Если кто-то искал Фреда в вашем примере, должен ли он быть выделен? – 2008-10-07 18:38:35
Да. Спасибо за вопрос. Хороший вопрос. Я отредактирую вопрос. – Chris 2008-10-07 18:43:17