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('<', '<', $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:
<small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
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 <
> to >
& to &
Quindi qualsiasi (e tutti) parser deve fare il seguente:
Diciamo che è necessario impostare il nodo del text (o il valore dell'attributo) su string come < my text & some more >
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>< my text & some more ></TextValue>
<TextValue>< my text & some more ></TextValue>
<TextValue><![CDATA[<my text & some more>]]></TextValue>
< 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 è: <small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
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