2011-04-02 5 views
0

suppose que j'ai cette fonction:inverser une expression régulière en php

function f($string){ 
    $string = preg_replace("`\[.*\]`U","",$string); 
    $string = preg_replace('`&(amp;)?#?[a-z0-9]+;`i','-',$string); 
    $string = htmlentities($string, ENT_COMPAT, 'utf-8'); 
    $string = preg_replace("`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);`i","\\1", $string); 
    $string = preg_replace(array("`[^a-z0-9]`i","`[-]+`") , "-", $string); 
    return $string; 
} 

comment puis-je inverser cette fonction ... ie. comment dois-je écrire le fReverse() fonction telle que nous avons les suivantes:

$s = f("some string223---"); 
$reversed = fReverse($s); 
echo $s; 

et sortie: certains string223 ---

+1

Pourquoi ne pas simplement enregistrer la première chaîne quelque part? –

+0

le point est de sorte que vous pouvez simplement inverser de façon dynamique de telles chaînes de l'URL afin de vaincre le but –

Répondre

7

f est lossy. Il est impossible de trouver un inverse exact. Par exemple, à la fois "some string223---" et "some string223--------" donne la même sortie (voir http://ideone.com/DtGQZ). Cependant, nous avons pu trouver une pré-image de f. Les 5 remplacements de f sont:

  1. Strip tout entre [ et ].
  2. Remplacez des entités telles que <, { et des entités codées telles que < par un trait d'union -.
  3. caractères d'échappement spéciaux HTML (<&lt;, &&amp; etc.)
  4. Retirez les accents de caractères accentués (&eacute; (= é) → e, etc.)
  5. Turn non-caractères alphanumériques et traits d'union consécutifs dans un trait d'union simple -.

En dehors de ceux-ci, il est possible que 1, 2, 4 et 5 soient des transformées d'identité. Par conséquent, une pré-image possible est juste inversée étape 3:

function fReverse($string) { 
    return html_entity_decode($string, ENT_COMPAT, 'utf-8'); 
}