Ошибка проверки: 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: ожидается ';'

Любые идеи относительно того, где отсутствует ';' должно идти? Есть ли другая проблема?


person Laxmidi    schedule 07.08.2010    source источник


Ответы (2)


В URL-адресе есть неэкранированные амперсанд &. Их нужно либо (а) изменить на символьные объекты (&amp;), либо (б) заключить в раздел CDATA.

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

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

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

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

person John Kugelman    schedule 07.08.2010

изменение содержимого не всегда возможно, например, при очистке веб-сайта.

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

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

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

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

person Dale Magee    schedule 04.07.2015