2010-06-24 18 views
5

Sto lavorando a un'applicazione PHP che deve analizzare le stringhe inviate da un altro programma. il problema è che alcune stringhe hanno caratteri ottali e altre fughe nel mezzo.Stringhe di decodifica in PHP

Così, invece di script>XYZ, sto ottenendo:

\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n..

E ho bisogno di stampare di nuovo questa stringa decodificata ... Ho provato ad utilizzare octdec, url_decode, ecc, ma si lavora solo con un carattere e l'altro non decodifica ottale ... Qualcuno ha suggerimenti?

+1

È difficile capire da un frammento così piccolo: hai provato base64? –

+3

@Mark: nessuna possibilità che potrebbe mai essere base64. –

risposta

1

Prova questo:

$str = '\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n..'; 

// CRIPT>XYZnn in documen.. 
echo preg_replace(array('~\\\(\d+)~e', '~%([0-9A-F]{2})~e'), array('chr(octdec("$1"))', 'chr(hexdec("$1"))'), $str); 

Per quanto riguarda le %AD parti, io non sono sicuro di quello che hanno lo scopo di rappresentare, potrebbe spiegare?

1
urldecode(stripcslashes("\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n..")); 
+0

'stripcslashes()' non gestisce '% AE'; gestisce '\ xAE'. – kiamlaluno

+0

Sì, da qui l'urldecode ... –

1

Utilizzare preg_replace_callback(). Utilizzare un modello che corrisponda sia al numero ottale, sia agli escape (assicurandosi di abbinare anche i caratteri \ e %. Basandosi sul primo carattere, il callback dovrebbe essere in grado di capire se convertire un numero ottale o convertire un .. fuga sequenza

la richiamata può convertire il numero da ottale o esadecimale, utilizzando base_convert() (base_convert($match, 8, 10) nel primo caso, base_convert($match, 16, 10) nel secondo caso)

+0

Come dovrebbe essere gestito quest'ultimo? –

+0

@ Ax Axel: la differenza è che il primo è un numero ottale e l'altro è un numero esadecimale. Se il callback riceve il carattere prima del numero, dovrebbe essere in grado di capire se ha ricevuto un numero ottale (il numero inizia con ')', o un numero esadecimale (inizia con '%'). – kiamlaluno

+0

Questo è quello che penso, 'hexdec()' come lanciare un errore ma l'ho risolto ora. Non c'è bisogno di usare un callback, 'preg_replace()' andrà bene, controlla la mia risposta. –

0
$octstr = '\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n'; 

preg_match_all('/\\\[0-9]{3}/',$octstr,$matches); 

$oct = $matches[0]; 

foreach($oct as $o){ 
    $octstr = str_replace($o,chr(octdec($o)),$octstr); 
} 

echo urldecode($octstr); 

uscite:

CRIPT>XYZnn in documen