Ошибка проверки: "EntityRef: ожидание ';'"

Привет у меня есть 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: ожидание ';'

есть идеи относительно того, куда должен идти пропавший';'? Есть еще одна проблема?

2 ответов


у вас есть неоткрытые амперсанды & в вашем URL. Они либо должны быть (a) изменены на символьные сущности (&amp;), или (b) заключенный в раздел CDATA.

раздел CDATA позволяет оставлять специальные символы, такие как & unescaped, так что это было бы проще всего:

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

вы можете включить все, что вы хотите внутри раздела CDATA помимо точной последовательности символов ]]>. The // комментарии там, чтобы убедиться, что браузеры, которые не понимают Разделы CDATA игнорируют <![CDATA[ и ]]> метки.

кстати, JavaScript чувствителен к регистру. Это должно быть getElementById не getelementbyid.


изменение содержимого не всегда возможно, e.g Если вы очищаете веб-сайт.

вы не можете просто str_replace ' & ' С '&', потому что html может включать допустимые объекты html, и вы получите что-то вроде "&"

вот регулярное выражение, которое должно заменить амперсанды на htmlentiries для амперсандов, не нарушая хорошие htmlentities:

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

я использовал его, чтобы очистить около 700 страниц без каких-либо проблем :)