XML o PHP o qualcuno sta mangiando i miei personaggi

Sono una ctriggers domanda lontano dall'essere bandito dal sito, ma questo ne vale la pena, ho passato ore e ore a cercare di trovare il problema ed eseguirne il debug, e semplicemente non posso, ho cercato alto e basso per le risposte e io sono senza tracce

Sto usando il PHP Document Document Parser Object e sto importndo un model XML di Wikipedia. Per ore stavo usando substr () e le mie risposte stavano tornando fuori come circa 14 personaggi. Quindi, per farla breve, si scopre che la discrepanza proviene dal> e dal <che ho in alcuni degli elementi

Ho provato tutto quello che riesco a pensare, tutto è UTF-8, ho provato il tipo casting alle stringhe, le mie intestazioni non vengono inviate come XML, è un normale output HTML, ho provato, ho provato mb_substr () e substr ()

str_replace('<', '&lt;', $string); 

È come se non import cosa faccio Non posso impedire a quei personaggi di scomparire nell'abisso, ma non so where stanno andando

Spero che qualcuno possa far luce su di esso

Modifica: Per chiarire un po ', ho scaricato un file XML direttamente da Wikipedia, una row in esso è ad esempio:

 &lt;small&gt;(1, 2, 3, 4, 33, 34, 64, 65, 66)&lt;big&gt;&lt;br/&gt; 

Ora se uso:

 dd(mb_substr($str, 1, 2)) 

Mi aspetterei "lt", ma in realtà quello che sto ottenendo è "sm", sta trattando il "<" come un singolo personaggio, ma se apro il file in Sublime, Notepad ++, EmEditor ecc, è 4 personaggi

Non capisco come PHP tratti la string, anche se uso str_replace () si rifiuta di diventare un'entity framework; HTML

Edit2:

Se vai a questo indirizzo:

https://en.wikipedia.org/wiki/Special:Export

e digitare "London" nella casella, verrà scaricato un file XML

In una class o ovunque, usa questo codice:

  $this->file = new \DOMDocument; $this->file->load('C:\path-to-your-xm-file.xml'); $pages = $this->file->getElementsByTagName('page'); foreach($pages as $page) { die(mb_substr($page->getElementsByTagName('text')->item(0)->nodeValue, 343, 1)); } 

Ora il 344 ° carattere dovrebbe essere una e commerciale, ma invece dà l'integer "<"

A mio avviso si tratta di parser XML (s). Secondo lo standard XML, tre caratteri devono essere codificati e decodificati come:

'< ' to &lt;

> to &gt;

& to &amp;

Quindi qualsiasi (e tutti) parser deve fare il seguente:

  1. Diciamo che è necessario impostare il nodo del text (o il valore dell'attributo) su string come < my text & some more >

  2. quindi supponiamo che sia un nodo di text nel tag XML <TextValue>

Secondo lo standard XML, questo text può essere presentato in un documento XML in due forms: <TextValue>&lt; my text &amp; some more &gt;</TextValue> <TextValue>&lt; my text &amp; some more &gt;</TextValue>

<TextValue><![CDATA[<my text & some more>]]></TextValue>

  1. Ora qualsiasi parser che deve restituire il valore del nodo di text da entrambe le presentazioni, deve restituire il valore effettivo della string, non la presentazione codificata XML.
  2. Poiché la string effettiva è < my text & some more > parser esegue la decodifica XML e restituisce il valore di string effettivo.

Non è correlato all'attuale implementazione di Parser (PHP, Java, DOM in Browser o qualsiasi altra cosa. È uno standard.

PS. Se hai qualche strumento XML con capacità XPath in mano puoi giocare con quell'esempio e vedere esattamente il comportmento definito.

UPD: Quindi la tua presentazione XML è: &lt;small&gt;(1, 2, 3, 4, 33, 34, 64, 65, 66)&lt;big&gt;&lt;br/&gt;

Quindi la string effettiva è <small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/> e ovviamente la lunghezza della string è 49 non 67 e mb_substr($str, 1, 2) restituisce esattamente sm dal valore di string effettivo e non dalla presentazione codificata XML