Estoy escribiendo código para una página de resultados de búsqueda que debe resaltar los términos de búsqueda. Los términos suceden dentro de las celdas de la tabla (la aplicación se itera a través de celdas de filas de GridView), y estas celdas de la tabla pueden tener HTML.¿Qué regex coincidirá con el texto excluyendo lo que se encuentra dentro de las etiquetas HTML?
Actualmente, mi código es el siguiente (trozos relevantes se muestran a continuación):
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);
Sorprendentemente funciona. Pero, a veces el texto que estoy coincidente en es HTML que tiene este aspecto:
<span class="CustomerName">Fred</span> was a classy individual.
Y si la búsqueda de la "clase" Quiero que el código más destacado para envolver la "clase" en "clase", pero por supuesto que no ¡el atributo HTML "clase" que está ahí! Si busca "Fred", eso debe resaltarse.
Entonces, ¿qué es una buena expresión regular que se asegurará de que las coincidencias ocurran solo FUERA de las etiquetas html? No tiene que ser súper duro. Simplemente me aseguro de que la coincidencia no esté entre < y> funcionaría bien.
Si alguien ha buscado a Fred en su ejemplo, ¿debería estar resaltado? –
Sí. Gracias por preguntar. Buena pregunta. Editaré la pregunta. – Chris