c# - 如何在不破坏 HTML 的情况下将 <span> 包裹在 HTML 中的匹配单词周围

标签 c# html

使用 C# - WinForms

我有一个有效的 HTML 字符串,它可能包含也可能不包含各种 HTML 元素,例如 <a> .

我需要搜索此 HTML 并突出显示某些关键字 - 突出显示是通过添加 <span> 来完成的使用内联样式围绕文本。我不应该为 <a> 这样做标签,或任何其他用户实际上不可见的 HTML 标签。

例如目前我正在这样做:

html = html.Replace(phraseToCount, "<span style=\"background: #FF0000; color: #FFFFFF; font-weight: bold;\">" + phraseToCount + "</span>");

这种方法可行,但会破坏 <a>标签。因此,在下面的示例中,只有 Cereal 一词的第一个实例应以 <span> 结尾。周围:

<p>To view more types of cereal click <a href="http://www.cereal.com">here</a>.</p>

我怎样才能做到这一点?

编辑 - 更多信息。

这将在 Winforms 应用程序中运行,因为获取 HTML 的最佳方式是使用 WebBrowser 控件 - 我将抓取网页并突出显示各种单词。

最佳答案

您将 HTML 作为纯文本处理。你不想要这样。您只想搜索 HTML 元素的“InnerText”,如 <p attribute="value">innertext</p> 中所示。 。不是通过标签、注释、样式和脚本以及文档中可以包含的任何其他内容。

为了正确地做到这一点,您需要解析 HTML,然后获取所有元素的 InnerTexts 并对其进行逻辑处理。

事实上,InnerText 是一种简化:当您有像 <p>FooBar<span>BarBaz</span></p> 这样的元素时哪里"Baz"是要替换的话,那么就需要实际递归迭代DOM中的所有节点,只替换text节点,因为写入 InnerText属性将删除所有子节点。

对于如何做到这一点,您需要使用一个库。您不想自己构建 HTML 解析器。例如,参见C#: HtmlAgilityPack extract inner text , Extracting Inner text from HTML BODY node with Html Agility Pack , How can i parse InnerText of <option> tag with HtmlAgilityPack? , Parsing HTML with CSQuery , HtmlAgilityPack - get all nodes in a document等等。

最重要的似乎是 How can I retrieve all the text nodes of a HTMLDocument in the fastest way in C#? :

HtmlNodeCollection coll = htmlDoc.DocumentNode.SelectNodes("//text()");

foreach (HtmlTextNode node in coll.Cast<HtmlTextNode>())
{
    node.Text = node.Text.Replace(...);
}

关于c# - 如何在不破坏 HTML 的情况下将 <span> 包裹在 HTML 中的匹配单词周围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941034/

相关文章:

c# - EF Core 3.1 cosmosdb 拥有的实体

css - 导航栏 - 需要帮助

javascript - 如何将粘性 div 保持在固定标题下方

javascript - 使用简单脚本进行 HTML 和 JavaScript (jQuery) 过滤

javascript - 在提交表单之前,所需的文本区域以红色突出显示

c# - ManagementObjectSearcher WMIquery 很慢

c# - 继承自一个类,这是做什么的?

css - 使用 HTML5 和 Bootstrap Select 选择的不同高度

c# - 存储为字符串的脚本的 IronPython 依赖项

c# - 从 Windows 应用程序的文本框中抓取文本