2009-09-15 4 views
0
$str = 
preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $str); 
+0

Attention: le titre contient un anglais cassé :) Veuillez corriger. –

Répondre

2

Il remplace chaque occurrence d'un caractère avec une valeur ordinale comprise entre 0 et 31 (principalement les caractères de contrôle et l'espacement, à l'exception du caractère espace réel) avec sa valeur numérique. Le e à la fin de la regex signifie «évaluer le modèle comme s'il s'agissait de code PHP», et permet la concaténation de chaînes et l'utilisation de sprintf dans preg_replace. La regex est délimitée par # au lieu de la plus courante /, sans raison dans ce cas (c'est généralement fait si la chaîne regex contient /, pour éviter de les échapper).

Par exemple:

<?php 
$str = "\t 22 \n ducks"; 
$str = preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $str); 
echo $str; 
?> 

Sorties:

\x09 22 \x0a ducks 

Retirez la e du modèle, et vous obtenez ceci:

"\x" . sprintf("%02x", ord(" ")) 22 "\x" . sprintf("%02x", ord(" ")) ducks 

au moins ici.

1

Mise à jour:

Je l'ai regardé de plus près et il semble que ce soit la conversion de tous ascii caractères dans la plage 1-31 à leur équivalent hexagonal avec un préfixe \x.

Ma conjecture de réaction intestinale d'origine que j'ai décidé est incorrect:

On dirait qu'il est urlencodage. J'utiliserais probablement la fonction construite dans php urlencode à la place.

+1

de 0 à 31, pas 1. –