Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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