验证失败:“EntityRef:expecting';'”

时间:2010-08-07 17:02:57

标签: xml validation xml-validation character-reference

您好我有一些不会验证的XML。我把问题缩小到了这一点:

<script type="text/javascript">document.getelementbyid("oxm-1f4a4485-5a1d-45f9-a989-9c65a0b9ceb6").src="http://bid.website.net/display?l=h4siaaaaaaaaad2nmq6cqbrenycw7qjyolfccxmregvcoae0u0sly_agtvaewwn4bg_havwbnebpvmzkkzra_kzzdvoloq4u-hjnp7sii0rxcbzz5vl5kxsrds6wtsfbxmcr9chysuhqbecuckb8cvx4m-pbcxugtdrll6d3dqtihnqukth2yvdkptr67cuzfvlxjlinkul9634lpal_h4mwhso8aabzhw1cdcwjxl6xivgv8agrjxjc_gaaaa==&p=h4siaaaaaaaaabxkmq7cmaxaurcqjjrrsfqqsrm7x3fsrwyvosda8qnj_3ojfgb49o45pblq7e80syzjhopggso9wyzpcpntzkxk1ldtbbi7otmxfj9da1wpjcf10vtxdj9e5_utyj19k2lfssepld5agnqaaaa=&url=http%3a%2f%2flocalhost%2fproject-debug%2fproject.html";</script>

我将它放在XML验证器中并吐出来:

  

此页面包含以下内容   错误:第16行第1行的错误:   EntityRef:期待';'

关于遗失';'的任何想法应该去?还有其他问题吗?

2 个答案:

答案 0 :(得分:26)

您的网址中有未转义的&符号&。它们要么需要(a)更改为字符实体(&amp;),要么(b)包含在CDATA部分中。

CDATA部分允许您保留&未转义的特殊字符,以便最简单:

<script type="text/javascript">
// <![CDATA[
    document.getElementById(...).src="...";
// ]]>
</script>

除了确切的字符序列]]>之外,您可以在CDATA部分中包含您想要的任何内容。 //评论用于确保不理解CDATA部分的浏览器忽略<![CDATA[]]>标记。

顺便说一句,JavaScript区分大小写。那应该是getElementById而不是getelementbyid

答案 1 :(得分:1)

修改内容并非总是可行,例如,如果您正在抓取网站。

你不能只是str_replace'&amp;'与'&amp; amp;'因为html可能包含有效的html实体,你会得到类似“&amp; amp; amp;”的内容。

这是一个正则表达式,应该用&符号替换&符号&符号,而不会破坏良好的性能:

$html = preg_replace("|&([^;]+?)[\s<&]|","&amp;$1 ",$html);

我用它来刮掉大约700页而没有任何问题:)