Errore di analisi del file xml in PHP

Sto cercando di usare simpleXML per get dati da http://rates.fxcm.com/RatesXML utilizzando simplexml_load_file() ho avuto degli errori a volte dato che questo sito ha sempre stringhe / numbers strani prima e dopo il file xml. Esempio:

 2000<?xml version="1.0" encoding="UTF-8"?> <Rates> <Rate Symbol="EURUSD"> <Bid>1.27595</Bid> <Ask>1.2762</Ask> <High>1.27748</High> <Low>1.27385</Low> <Direction>-1</Direction> <Last>23:29:11</Last> </Rate> </Rates> 0 

Ho quindi deciso di utilizzare file_get_contents e di analizzarlo come una string con simplexml_load_string() , in seguito, che uso substr() per rimuovere le stringhe prima e dopo. Tuttavia, a volte le stringhe casuali appariranno tra i nodes come questo:

 <Rate Symbol="EURTRY"> <Bid>2.29443</Bid> <Ask>2.29562</Ask> <High>2.29841</High> <Low>2.28999</Low> 137b <Direction>1</Direction> <Last>23:29:11</Last> </Rate> 

La mia domanda è, c'è comunque che io possa occuparmi di tutte queste stringhe casuali in movimento con qualsiasi function di regex indipendentemente da where sono posizionate? (pensa che sarà un'idea migliore piuttosto che contattare il sito per fargli trasmettere i file xml corretti)

Credo che la pre-elaborazione di XML con espressioni regolari potrebbe essere altrettanto brutta di analizzarla .

Ma ecco una sostituzione di preg che rimuove tutti i caratteri non di spaziatura, dall'inizio della string, dalla fine della string e dopo la chiusura / tag di chiusura automatica:

 $string = preg_replace( '~ (?| # start of alternation where capturing group count starts from # 1 for each alternative ^[^<]* # match non-< characters at the beginning of the string | # OR [^>]*$ # match non-> characters at the end of the string | # OR ( # start of capturing group $1: closing tag </[^>]++> # match a closing tag; note the possessive quantifier (++); it # suppresses backtracking, which is a convenient optimization, # the following bit is mutually exclusive anyway (this will be # used throughout the regex) \s++ # and the following whitespace ) # end of $1 [^<\s]*+ # match non-<, non-whitespace characters (the "bad" ones) (?: # start subgroup to repeat for more whitespace/non-whitespace # sequences \s++ # match whitespace [^<\s]++ # match at least one "bad" character )* # repeat # note that this will kind of pattern keeps all whitespace # before the first and the last "bad" character | # OR ( # start of capturing group $1: self-closing tag <[^>/]+/> # match a self-closing tag \s++ # and the following whitespace ) [^<]*+(?:\s++[^<\s]++)* # same as before ) # end of alternation ~x', '$1', $input); 

E poi semplicemente scriviamo il tag di chiusura o di chiusura automatica se ce n'era uno.

Uno dei motivi per cui questo approccio non è sicuro è che i tag di chiusura o di chiusura automatica potrebbero verificarsi all'interno di commenti o stringhe di attributi. Ma non posso suggerire di utilizzare un parser XML, dal momento che il parser XML non è in grado di analizzare l'XML.