2010-08-07 7 views
10

Hallo Ich habe einige XML, die nicht validieren. Ich habe das Problem auf diese Bit verengt:Validierung fehlgeschlagen: "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> 

ich es in einem XML-Validator gesetzt und es ausgespuckt:

Diese Seite enthält die folgenden Fehler: Fehler in Zeile 1, Spalte 16: EntityRef: erwartet ';'

Irgendwelche Ideen, wo das fehlende ";" soll gehen? Gibt es ein anderes Problem?

Antwort

25

Sie haben in Ihrer URLUnescaped-Zeichen gesetzt. Sie müssen entweder (a) in Zeicheneinheiten (&amp;) geändert werden oder (b) in einen CDATA-Abschnitt eingeschlossen sein.

Ein CDATA-Abschnitt können Sie Sonderzeichen wie & unescaped verlassen, so dass am einfachsten wäre:

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

Sie alles enthalten können Sie innerhalb eines CDATA-Abschnitt wollen abgesehen von der genauen Zeichenfolge ]]>. Die // Kommentare sollen sicherstellen, dass Browser, die CDATA-Abschnitte nicht verstehen, die <![CDATA[ und ]]> Marker ignorieren.

Übrigens ist JavaScript Groß-und Kleinschreibung. Das sollte getElementById nicht getelementbyid sein.

1

Änderung des Inhalts ist nicht immer möglich, z. B. wenn Sie eine Website scrapen.

Sie können "&" nicht mit "& amp;" weil das html gültige html-entities enthalten könnte, und man würde etwas wie "& amp; amp;"

Hier ist ein regulärer Ausdruck, der Et-Zeichen mit htmlentiries für Et-Zeichen, ohne zu brechen gute htmlentities ersetzen sollte:

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

Ich benutzte es zu kratzen über 700 Seiten ohne Probleme :)

Verwandte Themen