使用 C# - WinForms
我有一个有效的 HTML 字符串,它可能包含也可能不包含各种 HTML 元素,例如<a>.
我需要搜索此 HTML 并突出显示某些关键字 - 突出显示是通过在<span>文本周围添加内联样式来完成的。我不应该对<a>标签或用户实际上不可见的任何其他 HTML 标签执行此操作。
例如目前我正在这样做:
html = html.Replace(phraseToCount, "<span style=\"background: #FF0000; color: #FFFFFF; font-weight: bold;\">" + phraseToCount + "</span>");
Run Code Online (Sandbox Code Playgroud)
这种方法可行,但会破坏<a>标签。因此,在下面的示例中,只有谷物一词的第一个实例应该以 ' 结尾<span>:
<p>To view more types of cereal click <a href="http://www.cereal.com">here</a>.</p>
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做呢?
编辑-更多信息。
这将在 Winforms 应用程序中运行,因为获取 HTML 的最佳方法是使用 WebBrowser 控件 - 我将抓取网页并突出显示各种单词。
您将 HTML 作为纯文本处理。你不想要这样。您只想搜索 HTML 元素的“InnerText”,如<p attribute="value">innertext</p>. 不是通过标签、注释、样式和脚本以及文档中可以包含的任何其他内容。
为了正确地做到这一点,您需要解析 HTML,然后获取所有元素的 InnerTexts 并对其进行逻辑处理。
事实上,InnerText是一种简化:当你有一个像<p>FooBar<span>BarBaz</span></p>where"Baz"这样的元素需要被替换时,那么你需要实际递归地迭代DOM中的所有节点,并且只替换text节点,因为写入InnerText属性会删除所有子节点。
对于如何做到这一点,您需要使用一个库。您不想自己构建 HTML 解析器。例如,请参阅C#:HtmlAgilityPack 提取内部文本,使用 Html Agility Pack 从 HTML BODY 节点提取内部文本,如何使用 HtmlAgilityPack 解析 <option> 标记的 InnerText?、使用 CSQuery 解析 HTML、HtmlAgilityPack - 获取文档中的所有节点等等。
最重要的是如何在 C# 中以最快的方式检索 HTMLDocument 的所有文本节点?:
HtmlNodeCollection coll = htmlDoc.DocumentNode.SelectNodes("//text()");
foreach (HtmlTextNode node in coll.Cast<HtmlTextNode>())
{
node.Text = node.Text.Replace(...);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |