在PHP中反转正则表达式

kam*_*lot 0 php regex reverse function inverse

假设我有这个功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能扭转这个功能...即.我该如何编写函数fReverse(),以便我们有以下内容:

$s = f("some string223---");
$reversed = fReverse($s);
echo $s;
Run Code Online (Sandbox Code Playgroud)

和输出:一些string223 ---

ken*_*ytm 7

f是有损的.找不到确切的反转是不可能的.例如,既"some string223---""some string223--------"给出相同的输出(参见http://ideone.com/DtGQZ).


不过,我们可以找到一个前映像f.5个替换f是:

  1. 剥离[和之间的一切].
  2. 更换像实体<,{像和编码实体<,以一个连字符-.
  3. 转义特殊HTML字符(<&lt;,&&amp;等)
  4. 删除重音字符的重音(&eacute;(=é)→ e等)
  5. 将非字母数字和连续连字符转换为单个连字符-.

其中,1,2,4和5可能是同一性转换.因此,一个可能的原像只是反向步骤3:

function fReverse($string) {
   return html_entity_decode($string, ENT_COMPAT, 'utf-8');
}
Run Code Online (Sandbox Code Playgroud)