2010-06-24 16 views
5

Estoy trabajando en una aplicación PHP que tiene que analizar cadenas enviadas por otro programa. el problema es que algunas cadenas tienen caracteres octales y algunas otras escapadas en el medio.Cadenas de decodificación en PHP

Así que en lugar de script>XYZ, estoy consiguiendo:

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

Y necesito volver imprimir esta cadena decodificada ... Intenté usar octdec, url_decode, etc, pero sólo funciona con un carbón de leña y el otro no decodifica octal ... ¿Alguien tiene sugerencias?

+1

Es difícil de decir de un fragmento tan pequeño: ¿Has probado base64? –

+3

@Mark: ninguna posibilidad de que alguna vez pueda ser base64. –

Respuesta

1

Prueba esto:

$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); 

En cuanto a los %AD partes, no estoy seguro de lo que están destinados a representar, ¿podría explicar?

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

'stripcslashes()' no maneja '% AE'; maneja '\ xAE'. – kiamlaluno

+0

Sí, de ahí el código url ... –

1

Use preg_replace_callback(). Use un patrón que coincida tanto con el número octal como con los escapes (asegurándose de que coincida también con los caracteres \ y %. Basándose en el primer carácter, la devolución de llamada debe ser capaz de comprender si conviene convertir un número octal o convertir un número octal .. secuencia de escape

la devolución de llamada se puede convertir el número de octal o hexadecimal, utilizando base_convert() (base_convert($match, 8, 10) en el primer caso; base_convert($match, 16, 10) en el segundo caso)

+0

¿Cómo se debe manejar este último? –

+0

@Alix Axel: La diferencia es que el primero es un número octal, y el otro es un número hexadecimal. Si la devolución de llamada recibe el carácter antes del número, debería ser capaz de entender si recibió un número octal (el número comienza con ')', o un número hexadecimal (comienza con '%'). – kiamlaluno

+0

Eso es lo que pensé, 'hexdec()' arrojaba un error, pero lo he resuelto ahora. No es necesario utilizar una devolución de llamada, 'preg_replace()' funcionará bien, verifique mi respuesta. –

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); 

salidas:

CRIPT>XYZnn in documen