11

嗨,我有一些无法验证的 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 验证器中,它吐出:

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

关于丢失“;”的任何想法 应该去?还有问题吗?

4

2 回答 2

27

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

CDATA 部分允许您保留特殊字符,例如&未转义,所以这将是最简单的:

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

除了确切的字符序列之外,您还可以在 CDATA 部分中包含任何您想要的内容]]>。这些//注释是为了确保不理解 CDATA 部分的浏览器会忽略<![CDATA[]]>标记。

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

于 2010-08-07T17:08:06.543 回答
1

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

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

这是一个正则表达式,它应该用 htmlentiries 替换 & 符号,而不破坏好的 htmlentities:

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

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

于 2015-07-04T16:21:00.523 回答