在PHP中反转正则表达式

时间:2011-04-02 18:15:35

标签: php regex function reverse 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;
}

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

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

并输出:some string223 ---

1 个答案:

答案 0 :(得分:7)

f是有损的。找不到确切的反转是不可能的。例如,"some string223---""some string223--------"都会提供相同的输出(请参阅http://ideone.com/DtGQZ)。


然而,我们可以找到f的前映像。 f的5个替换是:

  1. []之间删除所有内容。
  2. <{等实体和<等编码实体替换为连字符-
  3. 转义特殊HTML字符(<&lt;&&amp;等。)
  4. 删除重音字符的重音符号(&eacute;(=é)→e等。)
  5. 将非字母数字和连续连字符转换为单个连字符-
  6. 其中,1,2,4和5可能是同一性转换。因此,一个可能的原像只是反向步骤3:

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