使用 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/