2010-08-07 13 views
10

Bonjour, J'ai un code XML qui ne sera pas validé. J'ai PRECISEE le problème à ce bit:Échec de la validation: "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> 

je le mets dans un validateur XML et craché:

Cette page contient les erreurs suivantes: erreur sur la ligne 1 à la colonne 16: EntityRef: attente de ';'

Aucune idée de l'endroit où le «; est censé aller? Y a-t-il un autre problème?

Répondre

25

Vous avez des esperluettes non échappées & dans votre URL. Ils doivent soit (a) être changés en entités de caractères (&amp;), soit (b) être inclus dans une section CDATA.

Une section CDATA vous permet de laisser des caractères spéciaux comme & déprotégés si ce serait plus facile:

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

Vous pouvez inclure tout ce que vous voulez à l'intérieur d'une section CDATA en dehors de la séquence exacte de caractères ]]>. Les commentaires // sont là pour s'assurer que les navigateurs qui ne comprennent pas les sections CDATA ignorent les marqueurs <![CDATA[ et ]]>. A propos, JavaScript est sensible à la casse. Par contre, JavaScript est sensible à la casse. Cela devrait être getElementById pas getelementbyid.

1

La modification du contenu n'est pas toujours possible, par exemple si vous êtes en train de graver un site Web.

vous ne pouvez pas simplement str_replace '&' avec '& amp;' parce que le html pourrait inclure des entités html valides, et vous obtiendriez quelque chose comme "& amp; amp;"

est ici une expression régulière qui devrait remplacer esperluette avec htmlentiries pour esperluette, sans casser les bonnes htmlentities:

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

Je l'ai utilisé pour gratter environ 700 pages sans aucun problème :)