A validação falhou: “EntityRef: esperando ';'"
-
26-09-2019 - |
Pergunta
Olá, eu tenho algum XML que não valida. Eu reduzi o problema a este bit:
<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>
Eu o coloquei em um validador XML e ele cuspiu:
Esta página contém os seguintes erros: Erro na linha 1 na coluna 16: EntityRef: Esperando ';'
Qualquer idéia sobre onde a falta ';' deveria ir? Existe outro problema?
Solução
Você tem amperas e sem desconstruir &
em seu URL. Eles precisam ser (a) alterados para entidades de personagem (&
), ou (b) fechado em uma seção CDATA.
Uma seção CDATA permite deixar personagens especiais como &
UNESCAPADO, então isso seria mais fácil:
<script type="text/javascript">
// <![CDATA[
document.getElementById(...).src="...";
// ]]>
</script>
Você pode incluir o que quiser dentro de uma seção CDATA, além da sequência exata do personagem ]]>
. o //
existem comentários para garantir que os navegadores que não entendam seções de CDATA ignoram o <![CDATA[
e ]]>
marcadores.
A propósito, o JavaScript é sensível ao minúsculo. Isso deveria ser getElementById
não getelementbyid
.
Outras dicas
Modificar o conteúdo nem sempre é possível, por exemplo, se você estiver raspando um site.
Você não pode simplesmente str_preplace '&' com '&' porque o HTML pode incluir entidades HTML válidas, e você obteria algo como "& amp;"
Aqui está um regex que deve substituir os ampeiros e por htmlentiries por amperands, sem quebrar boas htmlentities:
$html = preg_replace("|&([^;]+?)[\s<&]|","&$1 ",$html);
Eu usei para raspar cerca de 700 páginas sem problemas :)