繁体   English   中英

什么正则表达式将匹配文本,不包括HTML标记内的内容?

[英]What regex will match text excluding what lies within HTML tags?

我正在为搜索结果页面编写代码,需要突出显示搜索字词。 这些术语碰巧发生在表格单元格中(应用程序正在迭代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.

如果你搜索“类”我希望突出显示代码将“class”包装在“classy”中,但当然不是HTML属性“class”恰好在那里! 如果您搜索“Fred”,则应突出显示。

那么什么是一个好的正则表达式,以确保匹配只发生在html标签之外? 它不一定是超级铁杆。 我认为,只需确保匹配不在<和>之间就行了。

这个正则表达式应该完成这个工作: (?<!<[^>]*)(regex you want to check: Fred|span)它检查是否无法匹配正则表达式<[^>]*从a开始向后匹配字符串。

修改后的代码:

const string notInsideBracketsRegex = @"(?<!<[^>]*)";
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 + ")";
searchPattern = notInsideBracketsRegex + searchPattern;

// Highlight search terms in Customer - Comments column
e.Row.Cells[CUSTOMERCOMMENTS_COLUMN].Text = Regex.Replace(litCustomerComments.Text, searchPattern, highlightPattern, RegexOptions.IgnoreCase);

您可以使用正则表达式来平衡组和反向引用,但我强烈建议您在此处使用解析器

嗯,我不是C#程序员所以我不知道它使用的正则表达式的味道但是(?!<。+?>)应该忽略标签内的任何内容。 它将强制您在HTML代码中使用&#60&#62,但无论如何您应该这样做。

编写一个可以处理CDATA部分的正则表达式会很难。 您可能不再认为>关闭标签。

例如, "<span class="CustomerName>Fred.</span> is a good customer (<![CDATA[ >10000$ ]]> )"

解决方案是(如前所述)解析器。 他们在处理你在CDATA中遇到的那种混乱方面要好得多。 madgnome的向后检查不能用于找到起始<![CDATA from a ]]> ,因为CDATA部分可能包含文字<![CDATA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM