0

我正在使用 htmlagility 包来解析 html 字符串,并将某些模式转换为链接。

给定一个 html 字符串和一个模式“mystring”。我必须将 hrml 字符串中出现的这种模式替换为<a href="/mystring.html>mystring</a>. 但是有两个例外

1. 如果模式已经在锚标记内,我不应该替换它,这意味着它的直接父级或任何级别的父级都不应该是锚标记。例如:<a href="google.com><span>mystring</span><\a>
2.它不应该在href中。例如<a href="mystring">

  • 输入字符串:"<li><span>mystring test</span></li><li><a href='#'><span>mystring</span></li</li>"
  • 预期输出:"<li><span><a href="/mystring.html>mystring</a> test</span></li><li><a href='#'><span>mystring</span></li</li>"

我正在使用 htmlagilitypack 并将此字符串加载为 html doc 并获取所有文本并查看其任何级别的父级是否不是锚并替换它。一切工作简单而美好。但是这里有一个问题。

如果我的输入字符串类似于"li><span>mystring test < 10 and 5</span></li>"有问题。Htmlagility 解析器将小于符号视为 html 特殊字符,并将“< 10 和 5”视为 html 标记并产生类似的内容。

< 10="" and="" 5="">(具有空值的属性)。

是否可以使用 htmlagilityparser 解决此问题?我应该退后一步并使用正则表达式吗?在那种情况下,我该如何处理任何级别的锚异常?有没有更好的方法来解决这个问题?

4

2 回答 2

1

使用<外部 HTML 标记无效。改为使用&lt;实体。

编辑:如果无法控制输入字符串,您可以尝试替换“<”:

inputhtml = inputhtml.Replace("< ", "&lt; ");

如果还有其他错误,您可以尝试导入 MSHTML COM DLL。参考 COM dll“Microsoft HTML 对象库”。

于 2013-09-14T09:12:04.033 回答
0

两个建议:

  1. 您可以预先清理损坏的 HTML,以便 HtmlAgilityPack 更好地工作。这可能更容易。

  2. 或者通过简单的基于正则表达式的解析器自己解析和跟踪标签的嵌套结构。但是许多 HTML 标记不必以规范的方式结束,例如<TR> <TD> <P> <BR>.. 并且您还必须在此处处理损坏的 < 尖括号。

选项 2) 并不难——但首先要做更多的工作,以获得提高可靠性和控制如何处理来自低质量来源的“畸形”输入的回报。

于 2013-09-14T09:22:15.543 回答