Domanda

Ciao, ho un po 'di XML che non convaliderà. Ho ridotto il problema a questo 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>

L'ho messo in un validatore XML e ha sputato:

Questa pagina contiene i seguenti errori: Errore sulla riga 1 alla colonna 16: Entityref: aspettando ";"

Qualsiasi idea su dove la scomparsa ';' dovrebbe andare? C'è un altro problema?

È stato utile?

Soluzione

Hai ampori non scappato & Nel tuo URL. O devono essere (a) modificati in entità del personaggio (&amp;) o (b) racchiuso in una sezione CDATA.

Una sezione CDATA ti consente di lasciare caratteri speciali come & non scappato, quindi sarebbe più semplice:

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

Puoi includere tutto ciò che desideri all'interno di una sezione CDATA oltre alla sequenza esatta dei caratteri ]]>. Il // I commenti sono lì per assicurarsi che i browser che non capiscono le sezioni CDATA ignorano il <![CDATA[ e ]]> marcatori.

A proposito, JavaScript è sensibile al caso. Che dovrebbe essere getElementById non getelementbyid.

Altri suggerimenti

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

Non puoi semplicemente str_replace '&' with '&' perché l'HTML potrebbe includere entità HTML valide e otterresti qualcosa come "& amp;"

Ecco un regex che dovrebbe sostituire ampersands con htmlentiries per ampersands, senza rompere le buone htmlenties:

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

L'ho usato per raschiare circa 700 pagine senza problemi :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top