Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MatchEvaluator包装文本,不区分大小写,除非文本位于图像HTML标记内(但不忽略所有标记)_C#_Html_Regex_Replace_Tags - Fatal编程技术网

C# MatchEvaluator包装文本,不区分大小写,除非文本位于图像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,

我在CMS中创建了一个HTML文本体。我有一个自定义方法来突出显示文本中的搜索词,这样当用户从搜索结果导航到页面时,所有出现的搜索词都会突出显示。我将此设置为不区分大小写,以便匹配文本将突出显示,而不考虑大小写,并且结果将保留原始大小写:

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:
    ,然后捕获一个
    字符
  • |
    -或
  • 文本
    -一些字符串
如果组1匹配,则替换为组1值(即恢复
标记),否则用span标记包装匹配

不要忘记转义您的
searchTerm
,以确保它在包含特殊字符时不会引起问题。要搜索一个完整的单词,考虑使用明确的单词边界,<代码>(和<代码>(?!w))/>代码>代码>新正则表达式($@)(?*>)?
(<(?:img|a)(?:\s[^>]*>)?)|text