2010-08-07 9 views
10

Ciao, ho un codice XML che non verrà convalidato. Ho ridotto il problema a questo bit:Convalida non riuscita: "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> 

l'ho messo in un validatore XML e sputato fuori:

Questa pagina contiene le seguenti errori: Errore sulla linea 1 alla colonna 16: EntityRef: in attesa di ';'

Eventuali idee su dove manca ";" dovrebbe andare? C'è un altro problema?

risposta

25

Nel tuo URL sono stati contrassegnati come e commerciali &. Devono essere (a) modificati in entità carattere (&amp;) o (b) racchiusi in una sezione CDATA.

sezione A CDATA consente di lasciare i caratteri speciali come & escape, in modo che sarebbe più semplice:

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

È possibile includere tutto quello che vuoi all'interno di una sezione CDATA a parte l'esatta sequenza di caratteri ]]>. I commenti di // sono lì per assicurarti che i browser che non comprendono le sezioni CDATA ignorino i marcatori <![CDATA[ e ]]>.

A proposito, JavaScript è case sensitive. Deve essere getElementById non getelementbyid.

1

La modifica del contenuto non è sempre possibile, ad esempio se stai raschiando un sito web.

è possibile non solo str_replace '&' con '& amp;' perché l'html potrebbe includere entità html valide e otterresti qualcosa come "& amp; amp;"

Ecco un'espressione regolare che dovrebbe sostituire e commerciali con htmlentiries per e commerciali, senza rompere i buoni htmlentities:

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

ho usato per raschiare circa 700 pagine senza problemi :)

Problemi correlati