2010-06-24 5 views
5

Je travaille sur une application PHP qui doit analyser des chaînes envoyées par un autre programme. le problème est que certaines chaînes ont des caractères octaux et d'autres échappées au milieu.Décodage de chaînes en PHP

Ainsi, au lieu de script>XYZ, je reçois:

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

Et je dois imprimer de nouveau cette chaîne décodée ... J'ai essayé en utilisant octdec, url_decode, etc, mais on travaille seulement avec un omble chevalier et l'autre ne décode pas octal ... N'importe qui a des suggestions?

+1

Il est difficile de dire à partir d'un si petit extrait: Avez-vous essayé base64? –

+3

@Mark: Aucune chance qui pourrait jamais être base64. –

Répondre

1

Essayez ceci:

$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 ce qui concerne les pièces %AD, je ne suis pas sûr de ce que sont censés représenter, pourriez-vous expliquer?

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

'stripcslashes()' ne gère pas '% AE'; il gère '\ xAE'. – kiamlaluno

+0

Oui, d'où le code urinaire ... –

1

Utilisez preg_replace_callback(). Utilisez un motif qui correspond à la fois au nombre octal et aux échappements (en étant sûr de correspondre également aux caractères \ et %) En se basant sur le premier caractère, le rappel devrait être capable de comprendre si convertir un nombre octal, ou convertir un .. échapper séquence

le rappel peut convertir le nombre de octal ou hexadécimal, en utilisant base_convert() (base_convert($match, 8, 10) dans le premier cas; base_convert($match, 16, 10) dans le second cas)

+0

Comment ce dernier devrait-il être manipulé? –

+0

@Alix Axel: La différence est que le premier est un nombre octal, et l'autre est un nombre hexadécimal. Si le callback reçoit le caractère avant le numéro, il devrait être capable de comprendre s'il a reçu un nombre octal (le nombre commence par ')', ou un nombre hexadécimal (il commence par '%'). – kiamlaluno

+0

C'est ce que j'ai pensé, 'hexdec()' comme une erreur, mais je l'ai résolu maintenant. Il n'est pas nécessaire d'utiliser un rappel, 'preg_replace()' fera très bien, vérifiez ma réponse. –

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

sorties:

CRIPT>XYZnn in documen