Ошибка проверки: "EntityRef: ожидание ';'" - PullRequest
10 голосов
/ 07 августа 2010

Привет, у меня есть 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 ]

26 голосов
/ 07 августа 2010

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

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

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

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

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

1 голос
/ 04 июля 2015

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

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

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

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

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

...