C# MatchEvaluator包装文本,不区分大小写,除非文本位于图像HTML标记内(但不忽略所有标记)
我在CMS中创建了一个HTML文本体。我有一个自定义方法来突出显示文本中的搜索词,这样当用户从搜索结果导航到页面时,所有出现的搜索词都会突出显示。我将此设置为不区分大小写,以便匹配文本将突出显示,而不考虑大小写,并且结果将保留原始大小写:C# MatchEvaluator包装文本,不区分大小写,除非文本位于图像HTML标记内(但不忽略所有标记),c#,html,regex,replace,tags,C#,Html,Regex,Replace,Tags,我在CMS中创建了一个HTML文本体。我有一个自定义方法来突出显示文本中的搜索词,这样当用户从搜索结果导航到页面时,所有出现的搜索词都会突出显示。我将此设置为不区分大小写,以便匹配文本将突出显示,而不考虑大小写,并且结果将保留原始大小写: var regex = new Regex(searchTerm, RegexOptions.IgnoreCase); var evaluator = new MatchEvaluator(match => Evaluators.Wrap(match,
var regex = new Regex(searchTerm, RegexOptions.IgnoreCase);
var evaluator = new MatchEvaluator(match => Evaluators.Wrap(match, textToFormat, "<span class='highlight'>{0}</span>"));
var highlightedText = regex.Replace(textToFormat, evaluator);
var regex=new regex(searchTerm,RegexOptions.IgnoreCase);
var evaluator=newmatchevaluator(match=>Evaluators.Wrap(match,textToFormat,“{0}”);
var highlightedText=regex.Replace(textToFormat,evaluator);
这将导致以下结果(假设用户搜索了“文本”):
“这是一些文本!”->“这是一些文本!”
然而,我发现了一个问题,当HTML正文包含图像标记,而图像URL包含搜索词时,就会出现这个问题。这会破坏页面上的图像
"This is some text: <img src='/images/text.png'/>" -> "This is some <span class='highlight'>text</span>: <img src='/images/<span class='highlight'>text</span>.png'/>"
“这是一些文本:”->“这是一些文本:text.png'/>”
有没有一种方法可以让我忽略图像标记中的文本,同时仍然包装所有其他文本并保持大写
这与不同,因为在
和
标记中有大量文本需要替换。我只需要忽略
和
标记中的文本。您可以使用
var regex = new Regex($@"(<(?:img|a)(?:\s[^>]*>)?)|{Regex.Escape(searchTerm)}", RegexOptions.IgnoreCase);
var highlightedText = regex.Replace(textToFormat, m =>
m.Groups[1].Success ? m.Groups[1].Value : $"<span class='highlight'>{m.Value}</span>");
# => This is some <span class='highlight'>Text</span>: <a href='/text.html'><img src='/images/text.png'/></a>
var regex=newregex($@“(]*>)?)|{regex.Escape(searchTerm)},RegexOptions.IgnoreCase);
var highlightedText=regex.Replace(textToFormat,m=>
m、 组[1]。成功?m.Groups[1]。值:$“{m.Value}”);
#=>这是一些文字:
见
正则表达式是
(<(?:img|a)(?:\s[^>]*>)?)|text
(]*>)?)|文本
看。它匹配:
-捕获组1:(]*>)?)
,然后捕获一个
字符
-或|
-一些字符串文本
或
标记),否则用span标记包装匹配
不要忘记转义您的searchTerm
,以确保它在包含特殊字符时不会引起问题。要搜索一个完整的单词,考虑使用明确的单词边界,<代码>(和<代码>(?!w))/>代码>代码>新正则表达式($@)(?*>)?
(<(?:img|a)(?:\s[^>]*>)?)|text