2010-08-07 22 views
10

Hola, tengo algunos XML que no se validarán. He reducido el problema a este bit:Error de validación: "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> 

lo puse en un validador de XML y escupí:

Esta página contiene los siguientes errores: error en la línea 1 en la columna 16: EntityRef: esperando ';'

Cualquier idea sobre dónde falta el ';' se supone que ir? Hay otro problema?

Respuesta

25

Has anotado los símbolos & en tu URL. O bien deben (a) cambiarse a entidades de caracteres (&amp;), o (b) encerrarse en una sección CDATA.

sección A CDATA le permite dejar caracteres especiales como & sin escapar, por lo que habría más fácil:

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

Puede incluir cualquier cosa que usted quiere dentro de una sección CDATA, aparte de la secuencia de caracteres exacta ]]>. Los comentarios // están ahí para garantizar que los navegadores que no entienden las secciones CDATA ignoren los marcadores <![CDATA[ y ]]>.

Por cierto, JavaScript distingue entre mayúsculas y minúsculas. Eso debería ser getElementById no getelementbyid.

1

modificar el contenido no siempre es posible, por ejemplo, si está raspando un sitio web.

no puede simplemente str_replace '&' con '& amp;' porque el html puede incluir entidades html válidas, y obtendrá algo como "& amp; amp;"

Aquí es una expresión regular que debe sustituir a los símbolos de unión con htmlentiries para los símbolos de unión, sin romper buenas htmlentities:

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

Lo utilicé para raspar alrededor de 700 páginas sin ningún problema :)

Cuestiones relacionadas