2010-08-07 2 views
10

Привет, У меня есть XML, который не будет проверяться. Я сузили проблему до этого бита:Ошибка проверки: «EntityRef: expecting»; »

<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: ожидается ';'

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

ответ

25

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

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

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

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

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

1

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

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

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

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

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

Смежные вопросы