Validación fallida: "EntityRef: Wearing ';" "
-
26-09-2019 - |
Pregunta
Hola, tengo un XML que no validará. He reducido el 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>
Lo puse en un validador XML y se escapa:
Esta página contiene los siguientes errores: Error en la línea 1 en la columna 16: EntityRef: Esperando ';'
Cualquier idea sobre dónde los faltantes ';' se supone que debe irse? ¿Hay otro problema?
Solución
Tienes amperands sin nave &
en tu url. O necesitan ser (a) cambiados a entidades de personaje (&
), o (b) encerrado en una sección CDATA.
Una sección de Cdata te permite dejar caracteres especiales como &
sin ascender, así que sería más fácil:
<script type="text/javascript">
// <![CDATA[
document.getElementById(...).src="...";
// ]]>
</script>
Puede incluir todo lo que desee dentro de una sección de Cdata aparte de la secuencia de caracteres exacta ]]>
. los //
Los comentarios están ahí para asegurarse de que los navegadores que no entiendan las secciones de CDATA ignoran el <![CDATA[
y ]]>
marcadores.
Por cierto, JavaScript es sensible a los casos. Eso debería ser getElementById
no getelementbyid
.
Otros consejos
Modificar el contenido no siempre es posible, por ejemplo, si está raspando un sitio web.
No puede simplemente str_replace '&' con '&' porque el HTML podría incluir entidades HTML válidas, y obtendrá algo como "& amp;"
Aquí hay un Regex que debería reemplazar los ampersands con htmlentiries para ampersands, sin romper buenas htmlentidades:
$html = preg_replace("|&([^;]+?)[\s<&]|","&$1 ",$html);
Lo usé para raspar alrededor de 700 páginas sin ningún problema :)