我正在使用htmlagility包来解析html字符串,并将某些模式转换为链接。
给出一个html字符串和一个模式“mystring”。我必须用<a href="/mystring.html>mystring</a>
替换hrml字符串中此模式的出现。但有两个例外
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特殊字符,并将“&lt; 10和5”视为html标记,并生成类似这样的内容。
&LT; 10 =“”和=“”5 =“”&gt; (具有空值的属性)。
使用htmlagilityparser是否有解决方法? 我应退后一步并使用正则表达式吗?在那种情况下,我如何处理任何级别的锚点异常? 这个问题有更好的方法吗?
答案 0 :(得分:1)
在HTML标记外使用<
无效。请改用<
实体。
编辑:如果无法控制输入字符串,您可以尝试替换&#34;&lt; &#34;:
inputhtml = inputhtml.Replace("< ", "< ");
如果还有其他错误,您可以尝试导入MSHTML COM DLL。参考COM dll&#34; Microsoft HTML对象库&#34;。
答案 1 :(得分:0)
两个建议:
您可以预先清理损坏的HTML,以便HtmlAgilityPack更好地运行。这可能更容易。
或解析&amp;通过一个简单的基于正则表达式的解析器自己跟踪标签的嵌套结构。但是许多HTML标签不必在规范上结束,例如<TR> <TD> <P> <BR>
..并且你将不得不处理损坏的&lt;这里也有角括号。
选项2)并不难 - 但首先会有更多的工作,以获得更高的可靠性和收益。控制如何处理来自低质量来源的“格式错误”输入。