0

假设我有这个功能:

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

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

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

并输出:一些string223---

4

1 回答 1

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');
}
于 2011-04-02T18:20:07.703 回答